home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / vir_real / veos / part05 < prev    next >
Encoding:
Text File  |  1993-06-20  |  84.2 KB  |  3,265 lines

  1. Path: wupost!uunet!decwrl!vixie!vixie!not-for-mail
  2. From: voodoo@hitl.washington.edu (Geoffery Coco)
  3. Newsgroups: comp.sources.unix
  4. Subject: v26i188: veos-2.0 - The Virtual Environment Operating Shell, V2.0, Part05/16
  5. Date: 25 Apr 1993 23:14:59 -0700
  6. Organization: Vixie Home Computing
  7. Lines: 3252
  8. Sender: vixie@vix.com
  9. Approved: paul@vix.com
  10. Message-ID: <1rful3$5na@efficacy.home.vix.com>
  11. NNTP-Posting-Host: efficacy.home.vix.com
  12.  
  13. Submitted-By: voodoo@hitl.washington.edu (Geoffery Coco)
  14. Posting-Number: Volume 26, Issue 188
  15. Archive-Name: veos-2.0/part05
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 5 (of 16)."
  24. # Contents:  kernel_private/src/fern/fe_bnd.lsp
  25. #   kernel_private/src/fern/fe_ext.lsp kernel_private/src/fern/fern.c
  26. #   src/kernel_current/fern/fe_bnd.lsp
  27. #   src/kernel_current/fern/fe_ext.lsp src/kernel_current/fern/fern.c
  28. #   src/xlisp/xcore/c/xlimage.c
  29. # Wrapped by vixie@efficacy.home.vix.com on Sun Apr 25 23:10:36 1993
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'kernel_private/src/fern/fe_bnd.lsp' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fe_bnd.lsp'\"
  33. else
  34. echo shar: Extracting \"'kernel_private/src/fern/fe_bnd.lsp'\" \(10935 characters\)
  35. sed "s/^X//" >'kernel_private/src/fern/fe_bnd.lsp' <<'END_OF_FILE'
  36. X;;-----------------------------------------------------------
  37. X;; file: fe_bnd.lsp
  38. X;;
  39. X;; FERN is the Fractal Entity Relativity Node.
  40. X;; Part of the FE component of the Fern System.
  41. X;;
  42. X;; creation: March 28, 1992
  43. X;;
  44. X;; by Geoffrey P. Coco at the HITLab, Seattle
  45. X;;-----------------------------------------------------------
  46. X
  47. X
  48. X;;-----------------------------------------------------------
  49. X;; Copyright (C) 1992  Geoffrey P. Coco,
  50. X;; Human Interface Technology Lab, Seattle
  51. X;;-----------------------------------------------------------
  52. X
  53. X
  54. X
  55. X;;===========================================================
  56. X;;              Boundary
  57. X;;===========================================================
  58. X
  59. X(defun fe-put.bndry (bndry)
  60. X  (vput bndry '((~ "perc"
  61. X           @
  62. X           > @
  63. X           @) **)))
  64. X
  65. X;;-----------------------------------------------------------
  66. X
  67. X(defun fe-copy.bndry (&key (test-time nil))
  68. X  (car (vcopy '(("perc"
  69. X         @
  70. X         > @
  71. X         @) **)
  72. X          :test-time test-time)))
  73. X
  74. X;;-----------------------------------------------------------
  75. X
  76. X(defun fe-xtrct.bndry ()
  77. X  (vget '(("perc"
  78. X       @
  79. X       (> @@)
  80. X       @) **)))
  81. X
  82. X;;-----------------------------------------------------------
  83. X
  84. X(defun fe-get.bndry ()
  85. X  (car (vput "%" '((~ "perc"
  86. X              @
  87. X              > @
  88. X              @) **))))
  89. X
  90. X;;-----------------------------------------------------------
  91. X
  92. X
  93. X
  94. X;;===========================================================
  95. X;;               Virtual
  96. X;;===========================================================
  97. X
  98. X;; returns old virtual bndry
  99. X(defun fe-put.bndry.vrt (vbndry)
  100. X  (car (vput vbndry '((~ "perc"
  101. X             @
  102. X             (@ > @ @)
  103. X             @) **))))
  104. X
  105. X;;-----------------------------------------------------------
  106. X
  107. X;; cache this frequently used pattern in C level fern.
  108. X;; later, calls to fe-copy.bndry.vrt use precomputed pattern.
  109. X
  110. X(fbase-init-copy.bndry.vrt '(("perc"
  111. X                  @
  112. X                  (@ > @ @)
  113. X                  @) **))
  114. X
  115. X#|
  116. X(defun fe-copy.bndry.vrt (&key (test-time nil))
  117. X  (car (vcopy '(("perc"
  118. X         @
  119. X         (@ > @ @)
  120. X         @) **)
  121. X          :test-time test-time)))
  122. X|#
  123. X;;-----------------------------------------------------------
  124. X
  125. X(defun fe-xtrct.bndry.vrt ()
  126. X  (vget '(("perc"
  127. X       @
  128. X       (@ (> @@) @)
  129. X       @) **)))
  130. X
  131. X;;-----------------------------------------------------------
  132. X
  133. X(defun fe-get.bndry.vrt ()
  134. X  (car (vput "%" '(("perc"
  135. X            @
  136. X            (@ > @ @)
  137. X            @) **))))
  138. X
  139. X;;-----------------------------------------------------------
  140. X
  141. X
  142. X
  143. X;;===========================================================
  144. X;;               Virtual Objects
  145. X;;===========================================================
  146. X
  147. X(defun fe-jam.bndry.vrt.ob (ob)
  148. X  (vput ob '((~ "perc"
  149. X        @
  150. X        (@ (^ @@) @)
  151. X        @) **)))
  152. X
  153. X;;-----------------------------------------------------------
  154. X
  155. X;; objects are (ob-name (attr-list))
  156. X(defun fe-put.bndry.vrt.ob (ob)
  157. X  (cond
  158. X
  159. X   ;; assume object is already there
  160. X   ((car (vput ob `((~ "perc"
  161. X               @
  162. X               (@ (> (,(car ob) @) **) @)
  163. X               @) **))))
  164. X
  165. X   ;; object wasn't there, insert new one
  166. X   ((fe-jam.bndry.vrt.ob ob))
  167. X   ))
  168. X
  169. X;;-----------------------------------------------------------
  170. X
  171. X;; pass object name
  172. X(defun fe-copy.bndry.vrt.ob (ob-name &key (test-time nil))
  173. X  (car (vcopy `(("perc"
  174. X         @
  175. X         (@ (> (,ob-name @) **) @)
  176. X         @) **)
  177. X          :test-time test-time)))
  178. X
  179. X;;-----------------------------------------------------------
  180. X
  181. X(defun fe-xtrct.bndry.vrt.ob (ob-name)
  182. X  (car (vget `(("perc"
  183. X        @
  184. X        (@ (> (,ob-name @) **) @)
  185. X        @) **))))
  186. X
  187. X;;-----------------------------------------------------------
  188. X
  189. X(defun fe-get.bndry.vrt.ob (ob-name)
  190. X  (car (vput "%" `((~ "perc"
  191. X              @
  192. X              (@ ((~ ,ob-name > @) **) @)
  193. X              @) **))))
  194. X
  195. X;;-----------------------------------------------------------
  196. X
  197. X
  198. X
  199. X;;===========================================================
  200. X;;          Virtual Object - Complex
  201. X;;===========================================================
  202. X
  203. X(defun fe-copy.bndry.vrt.ob.names ()
  204. X  (vcopy `(("perc"
  205. X        @
  206. X        (@ ((> @ @) **) @)
  207. X        @) **)
  208. X     :freq "all"))
  209. X
  210. X;;-----------------------------------------------------------
  211. X
  212. X
  213. X
  214. X
  215. X;;===========================================================
  216. X;;          Virtual Object Attributes
  217. X;;===========================================================
  218. X
  219. X(defun fe-jam.bndry.vrt.ob.attr (ob-name attr)
  220. X  (cond
  221. X   ;; assume object exists, add new attr
  222. X   ((vput attr `((~ "perc"
  223. X            @
  224. X            (@ ((~ ,ob-name (^ @@)) **) @)
  225. X            @) **)))
  226. X   
  227. X   ;; object didn't exist, add new object with new attr.
  228. X   ((fe-jam.bndry.vrt.ob `(,ob-name (,attr))))
  229. X   ))
  230. X
  231. X;;-----------------------------------------------------------
  232. X
  233. X(defun fe-put.bndry.vrt.ob.attr (ob-name attr)
  234. X  (cond
  235. X
  236. X   ;; assume the object and attr exist, swap in new attr
  237. X   ((car (vput attr `((~ "perc"
  238. X             @
  239. X             (@ ((~ ,ob-name (> (,(car attr) @) **)) **) @)
  240. X             @) **))))
  241. X   
  242. X   ;; attr didn't exist, add new attr
  243. X   ((fe-jam.bndry.vrt.ob.attr ob-name attr))
  244. X   ))
  245. X
  246. X;;-----------------------------------------------------------
  247. X
  248. X(defun fe-xtrct.bndry.vrt.ob.attr (ob-name attr-name)
  249. X  (car (vget `(("perc"
  250. X        @
  251. X        (@ ((,ob-name (> (,attr-name @) **)) **) @)
  252. X        @) **))))
  253. X
  254. X;;-----------------------------------------------------------
  255. X
  256. X(defun fe-get.bndry.vrt.ob.attr (ob-name attr-name)
  257. X  (car (vput "%" `((~ "perc"
  258. X              @
  259. X              (@ ((~ ,ob-name ((~ ,attr-name > @) **)) **) @)
  260. X              @) **))))
  261. X
  262. X;;-----------------------------------------------------------
  263. X
  264. X;; returns attr struct
  265. X(defun fe-copy.bndry.vrt.ob.attr (ob-name attr-name &key (test-time nil))
  266. X  (car (vcopy `(("perc"
  267. X         @
  268. X         (@ ((,ob-name (> (,attr-name @) **)) **) @)
  269. X         @) **)
  270. X          :test-time test-time)))
  271. X  
  272. X;;-----------------------------------------------------------
  273. X
  274. X
  275. X
  276. X;;===========================================================
  277. X;;         Virtual Object Attributes - Complex
  278. X;;===========================================================
  279. X
  280. X;; returns list of boundary attribute names
  281. X(defun fe-copy.bndry.vrt.ob.attr.names (ob-name)
  282. X  (vcopy `(("perc"
  283. X        @
  284. X        (@ ((,ob-name ((> @ @) **)) **) @)
  285. X        @) **)
  286. X     :freq "all"))
  287. X
  288. X;;-----------------------------------------------------------
  289. X
  290. X;; returns attr val
  291. X(defun fe-copy.bndry.vrt.ob.attr.val (ob-name attr-name)
  292. X  (car (vcopy `(("perc"
  293. X         @
  294. X         (@ ((,ob-name ((,attr-name > @) **)) **) @)
  295. X         @) **))))
  296. X  
  297. X;;-----------------------------------------------------------
  298. X
  299. X
  300. X
  301. X
  302. X;;===========================================================
  303. X;;            Physical Sub-Partition
  304. X;;===========================================================
  305. X
  306. X;; returns old physical bndry
  307. X(defun fe-put.bndry.phys (vbndry)
  308. X  (car (vput vbndry '((~ "perc"
  309. X             @
  310. X             (@2 > @)
  311. X             @) **))))
  312. X
  313. X;;-----------------------------------------------------------
  314. X
  315. X(defun fe-copy.bndry.phys (&key (test-time nil))
  316. X  (car (vcopy '(("perc"
  317. X         @
  318. X         (@2 > @)
  319. X         @) **)
  320. X          :test-time test-time)))
  321. X
  322. X;;-----------------------------------------------------------
  323. X
  324. X(defun fe-xtrct.bndry.phys ()
  325. X  (vget '(("perc"
  326. X       @
  327. X       (@2 (> @@))
  328. X       @) **)))
  329. X
  330. X;;-----------------------------------------------------------
  331. X
  332. X(defun fe-get.bndry.phys ()
  333. X  (car (vput "%" '((~ "perc"
  334. X              @
  335. X              (@2 > @)
  336. X              @) **))))
  337. X
  338. X;;-----------------------------------------------------------
  339. X
  340. X
  341. X
  342. X;;===========================================================
  343. X;;               Physical Objects
  344. X;;===========================================================
  345. X
  346. X(defun fe-jam.bndry.phys.ob (ob)
  347. X  (vput ob '((~ "perc"
  348. X        @
  349. X        (@2 (^ @@))
  350. X        @) **)))
  351. X  
  352. X;;-----------------------------------------------------------
  353. X
  354. X;; objects are (ob-name (attr-list))
  355. X(defun fe-put.bndry.phys.ob (ob)
  356. X  (cond
  357. X
  358. X   ;; assume object is already there
  359. X   ((car (vput ob `((~ "perc"
  360. X               @
  361. X               (@2 (> (,(car ob) @) **))
  362. X               @) **))))
  363. X
  364. X   ;; object wasn't there, insert new one
  365. X   ((fe-jam.bndry.phys.ob ob))
  366. X   ))
  367. X
  368. X;;-----------------------------------------------------------
  369. X
  370. X;; pass object name
  371. X(defun fe-copy.bndry.phys.ob (ob-name &key (test-time nil))
  372. X  (car (vcopy `(("perc"
  373. X         @
  374. X         (@2 (> (,ob-name @) **))
  375. X         @) **)
  376. X          :test-time test-time)))
  377. X
  378. X;;-----------------------------------------------------------
  379. X
  380. X(defun fe-xtrct.bndry.phys.ob (ob-name)
  381. X  (car (vget `(("perc"
  382. X        @
  383. X        (@2 (> (,ob-name @) **))
  384. X        @) **))))
  385. X
  386. X;;-----------------------------------------------------------
  387. X
  388. X(defun fe-get.bndry.phys.ob (ob-name)
  389. X  (car (vput "%" `((~ "perc"
  390. X              @
  391. X              (@2 ((~ ,ob-name > @) **))
  392. X              @) **))))
  393. X
  394. X;;-----------------------------------------------------------
  395. X
  396. X
  397. X
  398. X
  399. X;;===========================================================
  400. X;;          Physical Object - Complex
  401. X;;===========================================================
  402. X
  403. X(defun fe-copy.bndry.phys.ob.names ()
  404. X  (vcopy `(("perc"
  405. X        @
  406. X        (@2 ((> @ @) **))
  407. X        @) **)
  408. X     :freq "all"))
  409. X
  410. X;;-----------------------------------------------------------
  411. X
  412. X
  413. X
  414. X
  415. X;;===========================================================
  416. X;;          Physical Object Attributes
  417. X;;===========================================================
  418. X
  419. X(defun fe-jam.bndry.phys.ob.attr (ob-name attr)
  420. X  (cond
  421. X   ;; assume object exists, add new attr
  422. X   ((vput attr `((~ "perc"
  423. X            @
  424. X            (@2 ((~ ,ob-name (^ @@)) **))
  425. X            @) **)))
  426. X
  427. X   ;; object didn't exist, add new object with new attr.
  428. X   ((fe-jam.bndry.phys.ob `(,ob-name (,attr))))
  429. X   ))
  430. X
  431. X;;-----------------------------------------------------------
  432. X
  433. X(defun fe-put.bndry.phys.ob.attr (ob-name attr)
  434. X  (cond
  435. X
  436. X   ;; assume the object and attr exist, swap in new attr
  437. X   ((car (vput attr `((~ "perc"
  438. X             @
  439. X             (@2 ((~ ,ob-name (> (,(car attr) @) **)) **))
  440. X             @) **))))
  441. X   
  442. X   ;; attr didn't exist, add new attr
  443. X   ((fe-jam.bndry.phys.ob.attr ob-name attr))
  444. X   ))
  445. X
  446. X;;-----------------------------------------------------------
  447. X
  448. X(defun fe-xtrct.bndry.phys.ob.attr (ob-name attr-name)
  449. X  (car (vget `(("perc"
  450. X        @
  451. X        (@2 ((,ob-name (> (,attr-name @) **)) **))
  452. X        @) **))))
  453. X
  454. X;;-----------------------------------------------------------
  455. X
  456. X(defun fe-get.bndry.phys.ob.attr (ob-name attr-name)
  457. X  (car (vput "%" `((~ "perc"
  458. X              @
  459. X              (@2 ((~ ,ob-name ((~ ,attr-name > @) **)) **))
  460. X              @) **))))
  461. X
  462. X;;-----------------------------------------------------------
  463. X
  464. X;; returns attr struct
  465. X(defun fe-copy.bndry.phys.ob.attr (ob-name attr-name &key (test-time nil))
  466. X  (car (vcopy `(("perc"
  467. X         @
  468. X         (@2 ((,ob-name (> (,attr-name @) **)) **))
  469. X         @) **)
  470. X          :test-time test-time)))
  471. X  
  472. X;;-----------------------------------------------------------
  473. X
  474. X
  475. X
  476. X;;===========================================================
  477. X;;         Physical Object Attributes - Complex
  478. X;;===========================================================
  479. X
  480. X;; returns list of boundary attribute names
  481. X(defun fe-copy.bndry.phys.ob.attr.names (ob-name)
  482. X  (vcopy `(("perc"
  483. X        @
  484. X        (@2 ((,ob-name ((> @ @) **)) **))
  485. X        @) **)
  486. X     :freq "all"))
  487. X
  488. X;;-----------------------------------------------------------
  489. X
  490. X;; returns attr val
  491. X(defun fe-copy.bndry.phys.ob.attr.val (ob-name attr-name)
  492. X  (car (vcopy `(("perc"
  493. X         @
  494. X         (@2 ((,ob-name ((,attr-name > @) **)) **))
  495. X         @) **))))
  496. X  
  497. X;;-----------------------------------------------------------
  498. X
  499. X
  500. X
  501. X
  502. END_OF_FILE
  503. if test 10935 -ne `wc -c <'kernel_private/src/fern/fe_bnd.lsp'`; then
  504.     echo shar: \"'kernel_private/src/fern/fe_bnd.lsp'\" unpacked with wrong size!
  505. fi
  506. # end of 'kernel_private/src/fern/fe_bnd.lsp'
  507. fi
  508. if test -f 'kernel_private/src/fern/fe_ext.lsp' -a "${1}" != "-c" ; then 
  509.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fe_ext.lsp'\"
  510. else
  511. echo shar: Extracting \"'kernel_private/src/fern/fe_ext.lsp'\" \(11360 characters\)
  512. sed "s/^X//" >'kernel_private/src/fern/fe_ext.lsp' <<'END_OF_FILE'
  513. X;;-----------------------------------------------------------
  514. X;; file: fe_ext.lsp
  515. X;;
  516. X;; FERN is the Fractal Entity Relativity Node.
  517. X;; Part of the FE component of the Fern System.
  518. X;;
  519. X;; creation: March 28, 1992
  520. X;;
  521. X;; by Geoffrey P. Coco at the HITLab, Seattle
  522. X;;-----------------------------------------------------------
  523. X
  524. X
  525. X;;-----------------------------------------------------------
  526. X;; Copyright (C) 1992  Geoffrey P. Coco,
  527. X;; Human Interface Technology Lab, Seattle
  528. X;;-----------------------------------------------------------
  529. X
  530. X
  531. X;;===========================================================
  532. X;;              External
  533. X;;===========================================================
  534. X
  535. X(defun fe-put.ext (ext)
  536. X  (vput ext '((~ "perc"
  537. X         > @
  538. X         @
  539. X         @) **)))
  540. X
  541. X;;-----------------------------------------------------------
  542. X
  543. X(defun fe-copy.ext (&key (test-time nil))
  544. X  (car (vcopy '(("perc"
  545. X         > @
  546. X         @
  547. X         @) **)
  548. X          :test-time test-time)))
  549. X
  550. X;;-----------------------------------------------------------
  551. X
  552. X(defun fe-xtrct.ext ()
  553. X  (vget '(("perc"
  554. X       (> @@)
  555. X       @
  556. X       @) **)))
  557. X
  558. X;;-----------------------------------------------------------
  559. X
  560. X(defun fe-get.ext ()
  561. X  (car (vput "%" '((~ "perc"
  562. X              > @
  563. X              @
  564. X              @) **))))
  565. X
  566. X;;-----------------------------------------------------------
  567. X
  568. X
  569. X
  570. X;;===========================================================
  571. X;;            Spaces Sub-Partition
  572. X;;===========================================================
  573. X
  574. X;; returns old space-list
  575. X(defun fe-put.ext.sps (sps)
  576. X  (car (vput sps '((~ "perc"
  577. X              (> @ @2)
  578. X              @2) **))))
  579. X
  580. X;;-----------------------------------------------------------
  581. X
  582. X(defun fe-copy.ext.sps (&key (test-time nil))
  583. X  (car (vcopy '(("perc"
  584. X         (> @ @2)
  585. X         @2) **)
  586. X          :test-time test-time)))
  587. X
  588. X;;-----------------------------------------------------------
  589. X
  590. X(defun fe-xtrct.ext.sps ()
  591. X  (vget '(("perc"
  592. X       ((> @@) @2)
  593. X       @2) **)))
  594. X
  595. X;;-----------------------------------------------------------
  596. X
  597. X(defun fe-get.ext.sps ()
  598. X  (car (vput "%" '((~ "perc"
  599. X              (> @ @2)
  600. X              @2) **))))
  601. X
  602. X;;-----------------------------------------------------------
  603. X
  604. X
  605. X;;===========================================================
  606. X;;               Spaces Entities
  607. X;;===========================================================
  608. X
  609. X;; an ent is (uid data)
  610. X(defun fe-jam.ext.sps.ent (ent)
  611. X  (vput ent '((~ "perc"
  612. X         ((^ @@) @2)
  613. X         @2) **)))
  614. X
  615. X;;-----------------------------------------------------------
  616. X
  617. X;; an ent is (uid data)
  618. X(defun fe-put.ext.sps.ent (ent)
  619. X  (cond
  620. X   ;; assume the entity already exists, swap in new one
  621. X   ((car (vput ent `((~ "perc"
  622. X            ((> (,(car ent) @) **) @2)
  623. X            @2) **))))
  624. X
  625. X   ;; entity didn' exist, insert new ent
  626. X   ((fe-jam.ext.sps.ent ent))))
  627. X
  628. X;;-----------------------------------------------------------
  629. X
  630. X(defun fe-copy.ext.sps.ent (uid &key (test-time nil))
  631. X  (car (vcopy `(("perc"
  632. X         ((> (,uid @) **) @2)
  633. X         @2) **)
  634. X          :test-time test-time)))
  635. X
  636. X;;-----------------------------------------------------------
  637. X
  638. X(defun fe-xtrct.ext.sps.ent (uid)
  639. X  (car (vget `(("perc"
  640. X        ((> (,uid @) **) @2)
  641. X        @2) **))))
  642. X
  643. X;;-----------------------------------------------------------
  644. X
  645. X(defun fe-get.ext.sps.ent (uid)
  646. X  (car (vput "%" `((~ "perc"
  647. X              (((~ ,uid > @) **) @2)
  648. X              @2) **))))
  649. X
  650. X;;-----------------------------------------------------------
  651. X
  652. X
  653. X
  654. X;;===========================================================
  655. X;;           Siblings Sub-Partition
  656. X;;===========================================================
  657. X
  658. X;; returns old sib-list
  659. X(defun fe-put.ext.sibs (sibs)
  660. X  (car (vput sibs '((~ "perc"
  661. X               (@ > @ @)
  662. X               @2) **))))
  663. X
  664. X;;-----------------------------------------------------------
  665. X
  666. X(defun fe-copy.ext.sibs (&key (test-time nil))
  667. X  (car (vcopy '(("perc"
  668. X         (@ > @ @)
  669. X         @2) **)
  670. X          :test-time test-time)))
  671. X
  672. X;;-----------------------------------------------------------
  673. X
  674. X(defun fe-xtrct.ext.sibs ()
  675. X  (vget '(("perc"
  676. X       (@ (> @@) @)
  677. X       @2) **)))
  678. X
  679. X;;-----------------------------------------------------------
  680. X
  681. X(defun fe-get.ext.sibs ()
  682. X  (car (vput "%" '((~ "perc"
  683. X              (@ > @ @)
  684. X              @2) **))))
  685. X
  686. X;;-----------------------------------------------------------
  687. X
  688. X
  689. X
  690. X;;===========================================================
  691. X;;              Siblings Entities
  692. X;;===========================================================
  693. X
  694. X(defun fe-jam.ext.sibs.ent (ent)
  695. X  (vput ent '((~ "perc"
  696. X         (@ (^ @@) @)
  697. X         @2) **)))
  698. X   
  699. X;;-----------------------------------------------------------
  700. X
  701. X;; sibling entities are in the form: (uid (virtual object list))
  702. X(defun fe-put.ext.sibs.ent (ent)
  703. X  (cond
  704. X   ;; assume the ent exists, swap in new ent
  705. X   ((car (vput ent `((~ "perc"
  706. X            (@ (> (,(car ent) @) **) @)
  707. X            @2) **))))
  708. X   ;; the ent didn't exist, add new ent
  709. X   ((fe-jam.ext.sibs.ent ent))
  710. X   ))
  711. X
  712. X;;-----------------------------------------------------------
  713. X
  714. X(defun fe-copy.ext.sibs.ent (uid &key (test-time nil))
  715. X  (car (vcopy `(("perc"
  716. X         (@ (> (,uid @) **) @)
  717. X         @2) **)
  718. X          :test-time test-time)))
  719. X
  720. X;;-----------------------------------------------------------
  721. X
  722. X(defun fe-xtrct.ext.ents.ent (uid)
  723. X  (car (vget `(("perc"
  724. X        (@ (> (,uid @) **) @)
  725. X        @2) **))))
  726. X
  727. X;;-----------------------------------------------------------
  728. X
  729. X(defun fe-get.ext.ents.ent (uid)
  730. X  (car (vput "%" `((~ "perc"
  731. X              (@ ((~ ,uid > @) **) @)
  732. X              @2) **))))
  733. X
  734. X;;-----------------------------------------------------------
  735. X
  736. X
  737. X
  738. X;;===========================================================
  739. X;;         Siblings Entities - Complex
  740. X;;===========================================================
  741. X
  742. X;; returns list of all external sibs' uids
  743. X(defun fe-copy.ext.sibs.uids ()
  744. X  (vcopy '(("perc"
  745. X        (@ ((> @ @) **) @)
  746. X        @2) **)
  747. X     :freq "all"))
  748. X
  749. X;;-----------------------------------------------------------
  750. X
  751. X
  752. X
  753. X
  754. X;;===========================================================
  755. X;;          Sibling Entities Objects
  756. X;;===========================================================
  757. X
  758. X(defun fe-jam.ext.sibs.ent.ob (uid ob)
  759. X  (cond
  760. X
  761. X   ;; assume entity exists, insert new object
  762. X   ((vput ob `((~ "perc"
  763. X          (@ ((~ ,uid (^ @@)) **) @)
  764. X          @2) **)))
  765. X
  766. X   ;; entity wasn't there, insert new entity with new object
  767. X   ((fe-jam.ext.sibs.ent `(,uid (,ob))))
  768. X   ))
  769. X   
  770. X;;-----------------------------------------------------------
  771. X
  772. X;; ob is a normal object structure: (name (attr-list))
  773. X(defun fe-put.ext.sibs.ent.ob (uid ob)
  774. X  (cond
  775. X
  776. X   ;; assume entity and object exist, swap in new object
  777. X   ((car (vput ob `((~ "perc"
  778. X               (@ ((~ ,uid (> (,(car ob) @) **)) **) @)
  779. X               @2) **))))
  780. X   
  781. X   ;; object wasn't there, assume entity exists, insert new object
  782. X   ((fe-jam.ext.sibs.ent.ob uid ob))
  783. X   ))
  784. X   
  785. X;;-----------------------------------------------------------
  786. X
  787. X(defun fe-copy.ext.sibs.ent.ob (uid ob-name &key (test-time nil))
  788. X  (car (vcopy `(("perc"
  789. X         (@ ((,uid (> (,ob-name @) **)) **) @)
  790. X         @2) **)
  791. X          :test-time test-time)))
  792. X
  793. X;;-----------------------------------------------------------
  794. X
  795. X(defun fe-xtrct.ext.sibs.ent.ob (uid ob-name)
  796. X  (car (vget `(("perc"
  797. X        (@ ((,uid (> (,ob-name @) **)) **) @)
  798. X        @2) **))))
  799. X
  800. X;;-----------------------------------------------------------
  801. X
  802. X(defun fe-get.ext.sibs.ent.ob (uid ob-name)
  803. X  (car (vput "%" `((~ "perc"
  804. X              (@ ((~ ,uid ((~ ,ob-name > @) **)) **) @)
  805. X              @2) **))))
  806. X
  807. X;;-----------------------------------------------------------
  808. X
  809. X
  810. X
  811. X;;===========================================================
  812. X;;         Sibling Entities Objects - Complex
  813. X;;===========================================================
  814. X
  815. X;; pass uid, get list of it's ob names
  816. X(defun fe-copy.ext.sibs.ent.ob.names (uid)
  817. X  (vcopy `(("perc"
  818. X        (@ ((,uid ((> @ @) **)) **) @)
  819. X        @2) **)
  820. X     :freq "all"))
  821. X
  822. X;;-----------------------------------------------------------
  823. X
  824. X
  825. X
  826. X;;===========================================================
  827. X;;         Sibling Entities Objects Attributes
  828. X;;===========================================================
  829. X
  830. X
  831. X(defun fe-jam.ext.sibs.ent.ob.attr (uid ob-name attr)
  832. X  (cond
  833. X   ;; assume entity and ob exists, insert new attr
  834. X   ((vput attr `((~ "perc"
  835. X          (@
  836. X           ((~ ,uid ((~ ,ob-name (^ @@)) **)) **)
  837. X           @)
  838. X          @2) **)))
  839. X  
  840. X   ;; ob wasn't there, insert new ob with new attr
  841. X   ((fe-jam.ext.sibs.ent.ob uid `(,ob-name (,attr))))
  842. X   ))
  843. X
  844. X;;-----------------------------------------------------------
  845. X
  846. X;; attr is ("attr-name" attr-val)
  847. X(defun fe-put.ext.sibs.ent.ob.attr (uid ob-name attr)
  848. X  (cond
  849. X   ;; assume the ent, ob and attr exist, swap in new attr
  850. X   ((car (vput attr `((~ "perc"
  851. X             (@ 
  852. X              ((~ ,uid ((~ ,ob-name (> (,(car attr) @) **)) **)) **)
  853. X              @)
  854. X             @2) **))))
  855. X
  856. X   ;; attr wasn't there, insert new attr
  857. X   ((fe-jam.ext.sibs.ent.ob.attr uid ob-name attr))
  858. X   ))
  859. X   
  860. X;;-----------------------------------------------------------
  861. X
  862. X;; pass uid, ob-num, attr-name
  863. X(defun fe-copy.ext.sibs.ent.ob.attr (uid ob-num attr-name &key (test-time nil))
  864. X  (car (vcopy `(("perc"
  865. X         (@
  866. X          ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  867. X          @)
  868. X         @2) **)
  869. X          :test-time test-time)))
  870. X
  871. X;;-----------------------------------------------------------
  872. X
  873. X;; pass uid, ob-num, attr-name
  874. X(defun fe-xtrct.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  875. X  (car (vget `(("perc"
  876. X        (@
  877. X         ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  878. X         @)
  879. X        @2) **))))
  880. X
  881. X;;-----------------------------------------------------------
  882. X
  883. X;; pass uid, ob-num, attr-name
  884. X(defun fe-get.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  885. X  (car (vput "%" `((~ "perc"
  886. X            (@
  887. X             ((~ ,uid ((~ ,ob-num ((~ ,attr-name > @) **)) **)) **)
  888. X             @)
  889. X            @2) **))))
  890. X
  891. X;;-----------------------------------------------------------
  892. X
  893. X
  894. X;;===========================================================
  895. X;;    Sibling Entities Objects Attributes - Complex
  896. X;;===========================================================
  897. X
  898. X;; pass uid and ob, return attr-list
  899. X(defun fe-copy.ext.sibs.ent.ob.attr.names (uid ob-name)
  900. X  (vcopy `(("perc"
  901. X        (@
  902. X         ((,uid ((,ob-name ((> @ @) **)) **)) **)
  903. X         @)
  904. X        @2) **)
  905. X     :freq "all"))
  906. X
  907. X;;-----------------------------------------------------------
  908. X
  909. X;; pass attr, return values of all objects of all sibs
  910. X(defun fe-copy.ext.sibs.attr.vals (attr-name)
  911. X  (vcopy `(("perc"
  912. X        (@
  913. X         ((@ ((@ ((,attr-name > @) **)) **)) **)
  914. X         @)
  915. X        @2) **)
  916. X     :freq "all"))
  917. X
  918. X;;-----------------------------------------------------------
  919. X
  920. X;; pass uid, ob-num, attr-name
  921. X(defun fe-copy.ext.sibs.ent.ob.attr.val (uid ob-num attr-name)
  922. X  (car (vcopy `(("perc"
  923. X         (@
  924. X          ((,uid ((,ob-num ((,attr-name > @) **)) **)) **)
  925. X          @)
  926. X         @2) **))))
  927. X
  928. X;;-----------------------------------------------------------
  929. X
  930. X
  931. X
  932. X
  933. X;;===========================================================
  934. X;;            Filters Sub-Partition
  935. X;;===========================================================
  936. X
  937. X;; filters are ("attr" (inclusion-list))
  938. X(defun fe-put.ext.fltrs (fltrs)
  939. X  (vput fltrs '((~ "perc"
  940. X           (@2 > @)
  941. X           @2) **)))
  942. X
  943. X;;-----------------------------------------------------------
  944. X
  945. X(defun fe-copy.ext.fltrs (&key (test-time nil))
  946. X  (car (vcopy '(("perc"
  947. X         (@2 > @)
  948. X         @2) **)
  949. X          :test-time test-time)))
  950. X
  951. X;;-----------------------------------------------------------
  952. X
  953. X(defun fe-xtrct.ext.fltrs ()
  954. X  (vget '(("perc"
  955. X       (@2 (> @@))
  956. X       @2) **)))
  957. X
  958. X;;-----------------------------------------------------------
  959. X
  960. X(defun fe-get.ext.fltrs ()
  961. X  (car (vput "%" '((~ "perc"
  962. X              (@2 > @)
  963. X              @2) **))))
  964. X
  965. X;;-----------------------------------------------------------
  966. END_OF_FILE
  967. if test 11360 -ne `wc -c <'kernel_private/src/fern/fe_ext.lsp'`; then
  968.     echo shar: \"'kernel_private/src/fern/fe_ext.lsp'\" unpacked with wrong size!
  969. fi
  970. # end of 'kernel_private/src/fern/fe_ext.lsp'
  971. fi
  972. if test -f 'kernel_private/src/fern/fern.c' -a "${1}" != "-c" ; then 
  973.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fern.c'\"
  974. else
  975. echo shar: Extracting \"'kernel_private/src/fern/fern.c'\" \(11012 characters\)
  976. sed "s/^X//" >'kernel_private/src/fern/fern.c' <<'END_OF_FILE'
  977. X/****************************************************************************************
  978. X * file: fern.c                                        *
  979. X *                                            *
  980. X * February 25, 1992: implementation of the Fractal Entity Relativity Node for veos.    *
  981. X *                                                    *
  982. X * by Geoffrey P. Coco at the HITLab, Seattle.                          *
  983. X *                                            *
  984. X ****************************************************************************************/
  985. X
  986. X/****************************************************************************************
  987. X * Copyright (C) 1992  Human Interface Technology Lab, Seattle                *
  988. X ****************************************************************************************/
  989. X
  990. X
  991. X/*--------------------------------------------------------------------------------*
  992. X                 Preliminaries
  993. X *--------------------------------------------------------------------------------*/
  994. X
  995. X
  996. X#include "xlisp.h"
  997. X#include "kernel.h"
  998. X#include "xv_native.h"
  999. X#include "fern.h"
  1000. X
  1001. X#include <math.h>
  1002. X
  1003. X/*--------------------------------------------------------------------------------*/
  1004. X
  1005. Xboolean        fbase_bInit = FALSE;
  1006. Xboolean        fbase_bGoing = FALSE;
  1007. XLVAL        s_pPersistFunc, s_pPersistProcs;
  1008. XTStampEntHash    fbase_pHashes[5];
  1009. Xint        fbase_iHashFree;
  1010. XTXMandRRec    fbase_pbCopyIntSubs;
  1011. XTXMandRRec    fbase_pbCopyBndryVrt;
  1012. X
  1013. X/*--------------------------------------------------------------------------------*/
  1014. X
  1015. Xvoid Fbase_Frame();
  1016. XTVeosErr Fbase_InitMatcherPBs();
  1017. X
  1018. X/*--------------------------------------------------------------------------------*/
  1019. X
  1020. X
  1021. X/*--------------------------------------------------------------------------------*
  1022. X                 Lisp Interface To Fern
  1023. X *--------------------------------------------------------------------------------*/
  1024. X
  1025. X
  1026. X/*--------------------------------------------------------------------------------*/
  1027. XLVAL Fbase_Init()
  1028. X{
  1029. X    if (!fbase_bInit) {
  1030. X
  1031. X    /** make permanent xlisp symbol to contain persist function call **/
  1032. X    
  1033. X    s_pPersistFunc = xlenter("FC-PRS-NTRY");
  1034. X    setvalue(s_pPersistFunc, cons(xlenter("FCON-PERSIST"), NIL));
  1035. X
  1036. X    s_pPersistProcs = xlenter("PERSIST-PROCS");
  1037. X
  1038. X    fbase_iHashFree = 0;
  1039. X
  1040. X    Fbase_InitMatcherPBs();
  1041. X    }
  1042. X
  1043. X    return(true);
  1044. X    }
  1045. X/*--------------------------------------------------------------------------------*/
  1046. X
  1047. X
  1048. X
  1049. X/*--------------------------------------------------------------------------------*/
  1050. XLVAL Fbase_fcon_time()
  1051. X{
  1052. X    xllastarg();
  1053. X
  1054. X    Fbase_Frame();
  1055. X
  1056. X    return(true);
  1057. X    } 
  1058. X/*--------------------------------------------------------------------------------*/
  1059. X
  1060. X
  1061. X/*--------------------------------------------------------------------------------*/
  1062. XLVAL Fbase_fcon_go()
  1063. X{
  1064. X    xllastarg();
  1065. X
  1066. X    fbase_bGoing = TRUE;
  1067. X    while (fbase_bGoing)
  1068. X    Fbase_Frame();
  1069. X
  1070. X    return(true);
  1071. X    }
  1072. X/*--------------------------------------------------------------------------------*/
  1073. X
  1074. X
  1075. X/*--------------------------------------------------------------------------------*/
  1076. XLVAL Fbase_fcon_local_ungo()
  1077. X{
  1078. X    xllastarg();
  1079. X
  1080. X    fbase_bGoing = FALSE;
  1081. X
  1082. X    return(true);
  1083. X    }
  1084. X/*--------------------------------------------------------------------------------*/
  1085. X
  1086. X
  1087. X/*--------------------------------------------------------------------------------*/
  1088. X/* returns: hash-table-index of new fern maintained hash table
  1089. X */
  1090. XLVAL Fbase_Hash_NewTab()
  1091. X{
  1092. X    int        i, iHashTab;
  1093. X    
  1094. X    iHashTab = fbase_iHashFree++;
  1095. X    for (i=0; i<12; i++)
  1096. X    fbase_pHashes[iHashTab][i] = nil;
  1097. X
  1098. X    return(cvfixnum(iHashTab));
  1099. X    }
  1100. X/*--------------------------------------------------------------------------------*/
  1101. X
  1102. X
  1103. X/*--------------------------------------------------------------------------------*/
  1104. X/* args: hash-table-refnum, new-uid, initial-float-data 
  1105. X */
  1106. XLVAL Fbase_Hash_AddUid()
  1107. X{
  1108. X    LVAL        pReturn = NIL, pUid;
  1109. X    int            i, iHashTab, iHashIndex;
  1110. X    float            fData;
  1111. X    TPStampEntRec    pNode, pFinger;
  1112. X
  1113. X    iHashTab = getfixnum(xlgafixnum());
  1114. X
  1115. X    pUid = xlgavector();
  1116. X#ifndef OPTIMAL
  1117. X    if (!IsUidElt(pUid))
  1118. X    xlbadtype(pUid);
  1119. X#endif
  1120. X
  1121. X    fData = getflonum(xlgaflonum());
  1122. X
  1123. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1124. X
  1125. X
  1126. X    /** check for this uid already in table...
  1127. X     ** if so, just update data
  1128. X     **/
  1129. X    for (pNode = fbase_pHashes[iHashTab][iHashIndex];
  1130. X     pNode;
  1131. X     pNode = pNode->pNext) {
  1132. X    
  1133. X    if (FBASE_HASH_HIT(pUid, pNode)) {
  1134. X        pNode->fData = fData;
  1135. X        pReturn = true;
  1136. X        break;
  1137. X        }
  1138. X    }
  1139. X
  1140. X    /** uid not found, add new hash entry.
  1141. X     **/
  1142. X    if (pReturn == NIL) {
  1143. X
  1144. X    if (Shell_NewBlock(sizeof(TStampEntRec), 
  1145. X               &pNode, "fern-hash-node") == VEOS_SUCCESS) {
  1146. X        
  1147. X        strcpy(pNode->sHost, getstring(getelement(pUid, 0)));
  1148. X        pNode->iPort = getfixnum(getelement(pUid, 1));
  1149. X        pNode->fData = fData;
  1150. X        
  1151. X        pNode->pNext = fbase_pHashes[iHashTab][iHashIndex];
  1152. X        fbase_pHashes[iHashTab][iHashIndex] = pNode;
  1153. X        
  1154. X        pReturn = true;
  1155. X        }
  1156. X    }
  1157. X
  1158. X    return(pReturn);
  1159. X    }
  1160. X/*--------------------------------------------------------------------------------*/
  1161. X
  1162. X
  1163. X/*--------------------------------------------------------------------------------*/
  1164. X/* args: hash-table-index, uid
  1165. X */
  1166. XLVAL Fbase_Hash_RemoveUid()
  1167. X{
  1168. X    LVAL        pReturn = NIL, pUid;
  1169. X    int            i, iHashTab, iHashIndex;
  1170. X    THStampEntRec    hFinger;
  1171. X    TPStampEntRec    pSave;
  1172. X
  1173. X    iHashTab = getfixnum(xlgafixnum());
  1174. X
  1175. X    pUid = xlgavector();
  1176. X    if (!IsUidElt(pUid))
  1177. X    xlbadtype(pUid);
  1178. X
  1179. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1180. X    for (hFinger = &(fbase_pHashes[iHashTab][iHashIndex]);
  1181. X     *hFinger;
  1182. X     hFinger = &(*hFinger)->pNext) {
  1183. X
  1184. X    if (FBASE_HASH_HIT(pUid, *hFinger)) {
  1185. X        pSave = *hFinger;
  1186. X        *hFinger = pSave->pNext;
  1187. X        Shell_ReturnBlock(pSave, sizeof(TStampEntRec), "fern-hash-node");
  1188. X        pReturn = true;
  1189. X        break;
  1190. X        }
  1191. X    }
  1192. X
  1193. X    return(pReturn);
  1194. X    }
  1195. X/*--------------------------------------------------------------------------------*/
  1196. X
  1197. X
  1198. X/*--------------------------------------------------------------------------------*/
  1199. X/* args: hash-table-index, uid, float-to-place-data.
  1200. X * returns: true or NIL
  1201. X */
  1202. XLVAL Fbase_Hash_HashUid()
  1203. X{
  1204. X    LVAL        pReturn = NIL, pUid, pData;
  1205. X    int            i, iHashTab, iHashIndex;
  1206. X    TPStampEntRec    pFinger;
  1207. X
  1208. X    iHashTab = getfixnum(xlgafixnum());
  1209. X
  1210. X    pUid = xlgavector();
  1211. X    if (!IsUidElt(pUid))
  1212. X    xlbadtype(pUid);
  1213. X
  1214. X    pData = xlgaflonum();
  1215. X
  1216. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1217. X    for (pFinger = fbase_pHashes[iHashTab][iHashIndex];
  1218. X     pFinger;
  1219. X     pFinger = pFinger->pNext) {
  1220. X    
  1221. X    if (FBASE_HASH_HIT(pUid, pFinger)) {
  1222. X        setflonum(pData, pFinger->fData);
  1223. X        pReturn = true;
  1224. X        break;
  1225. X        }
  1226. X    }
  1227. X
  1228. X    return(pReturn);
  1229. X    }
  1230. X/*--------------------------------------------------------------------------------*/
  1231. X
  1232. X
  1233. X/*--------------------------------------------------------------------------------*/
  1234. XLVAL Fbase_Init_CopyIntSubs()
  1235. X{
  1236. X    TVeosErr        iErr;
  1237. X
  1238. X    iErr = Native_GetPatternArg(&fbase_pbCopyIntSubs.pPatGr, NANCY_CopyMatch);
  1239. X
  1240. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  1241. X    }
  1242. X/*--------------------------------------------------------------------------------*/
  1243. X
  1244. X
  1245. X
  1246. X/*--------------------------------------------------------------------------------*/
  1247. XLVAL Fbase_CopyIntSubs()
  1248. X{
  1249. X    TVeosErr        iErr;
  1250. X    LVAL        pReturn;
  1251. X    TTimeStamp        tTest;
  1252. X
  1253. X
  1254. X    /** look for optional time-stamp-test **/
  1255. X
  1256. X    NATIVE_TIME_ARG(fbase_pbCopyIntSubs.pTestTime, tTest);
  1257. X
  1258. X
  1259. X    /** dispatch the matcher **/
  1260. X
  1261. X    xlsave1(fbase_pbCopyIntSubs.pXResult);
  1262. X    
  1263. X    Native_XMandR(&fbase_pbCopyIntSubs);
  1264. X
  1265. X    xlpop();
  1266. X
  1267. X    pReturn = consp(fbase_pbCopyIntSubs.pXResult) ?
  1268. X    car(fbase_pbCopyIntSubs.pXResult) : fbase_pbCopyIntSubs.pXResult;
  1269. X
  1270. X    return(pReturn);
  1271. X    }
  1272. X/*--------------------------------------------------------------------------------*/
  1273. X
  1274. X
  1275. X/*--------------------------------------------------------------------------------*/
  1276. XLVAL Fbase_Init_CopyBndryVrt()
  1277. X{
  1278. X    TVeosErr        iErr;
  1279. X
  1280. X    iErr = Native_GetPatternArg(&fbase_pbCopyBndryVrt.pPatGr, NANCY_CopyMatch);
  1281. X
  1282. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  1283. X    }
  1284. X/*--------------------------------------------------------------------------------*/
  1285. X
  1286. X
  1287. X
  1288. X/*--------------------------------------------------------------------------------*/
  1289. XLVAL Fbase_CopyBndryVrt()
  1290. X{
  1291. X    TVeosErr        iErr;
  1292. X    LVAL        pReturn;
  1293. X    TTimeStamp        tTest;
  1294. X
  1295. X
  1296. X    /** look for optional time-stamp-test **/
  1297. X
  1298. X    NATIVE_TIME_ARG(fbase_pbCopyBndryVrt.pTestTime, tTest);
  1299. X
  1300. X
  1301. X    /** dispatch the matcher **/
  1302. X
  1303. X    xlsave1(fbase_pbCopyBndryVrt.pXResult);
  1304. X    
  1305. X    Native_XMandR(&fbase_pbCopyBndryVrt);
  1306. X
  1307. X    xlpop();
  1308. X
  1309. X    pReturn = consp(fbase_pbCopyBndryVrt.pXResult) ?
  1310. X    car(fbase_pbCopyBndryVrt.pXResult) : fbase_pbCopyBndryVrt.pXResult;
  1311. X
  1312. X    return(pReturn);
  1313. X    }
  1314. X/*--------------------------------------------------------------------------------*/
  1315. X
  1316. X
  1317. X/*--------------------------------------------------------------------------------*
  1318. X           Beuratrcatic Linkage Between Fern Prims and XLISP
  1319. X *--------------------------------------------------------------------------------*/
  1320. X
  1321. X
  1322. X/*--------------------------------------------------------------------------------*/
  1323. XTVeosErr Fern_LoadPrims()
  1324. X{
  1325. X#define FERN_LOAD
  1326. X#include "fern_prims.h"
  1327. X#define FERN_LOAD
  1328. X    }
  1329. X/*--------------------------------------------------------------------------------*/
  1330. X
  1331. X
  1332. X
  1333. X/*--------------------------------------------------------------------------------*
  1334. X                   Private Functions
  1335. X *--------------------------------------------------------------------------------*/
  1336. X
  1337. X
  1338. X/*--------------------------------------------------------------------------------*/
  1339. XTVeosErr Fbase_()
  1340. X{
  1341. X    TVeosErr        iErr;
  1342. X
  1343. X    return(iErr);
  1344. X    }
  1345. X/*--------------------------------------------------------------------------------*/
  1346. X
  1347. X
  1348. X
  1349. X/*--------------------------------------------------------------------------------*/
  1350. Xvoid Fbase_Frame()
  1351. X{
  1352. X    LVAL        pMsg;
  1353. X
  1354. X
  1355. X    /** pass time to veos kernel for accounting.
  1356. X     **/
  1357. X    Kernel_SystemTask();
  1358. X
  1359. X
  1360. X    for (Native_NextMsg(&pMsg);
  1361. X     pMsg;
  1362. X     Native_NextMsg(&pMsg)) {
  1363. X
  1364. X    /** invoke normal lisp evaluator on message. 
  1365. X     **/ 
  1366. X    xlxeval(pMsg); 
  1367. X
  1368. X    /** at top of loop, when msgVar is set to next msg, 
  1369. X     ** old contents of msgVar are detached from any protected xlisp ptr, 
  1370. X     ** thus it will be garbage collected. 
  1371. X     **/ 
  1372. X    } 
  1373. X
  1374. X    /** do the persist procs. 
  1375. X     **/ 
  1376. X    if (!null(getvalue(s_pPersistProcs)))
  1377. X    xleval(getvalue(s_pPersistFunc));
  1378. X    }
  1379. X/*--------------------------------------------------------------------------------*/
  1380. X
  1381. X
  1382. X
  1383. X/*--------------------------------------------------------------------------------*/
  1384. XTVeosErr Fbase_InitMatcherPBs()
  1385. X{
  1386. X    /** copy-int-subs settings **/
  1387. X    
  1388. X    fbase_pbCopyIntSubs.pSrcGr = WORK_SPACE;
  1389. X    fbase_pbCopyIntSubs.iDestroyFlag = NANCY_CopyMatch;
  1390. X    fbase_pbCopyIntSubs.pXReplaceElt = nil;
  1391. X    fbase_pbCopyIntSubs.pStampTime = nil;
  1392. X
  1393. X    /** copy-bndry-vrt settings **/
  1394. X    
  1395. X    fbase_pbCopyBndryVrt.pSrcGr = WORK_SPACE;
  1396. X    fbase_pbCopyBndryVrt.iDestroyFlag = NANCY_CopyMatch;
  1397. X    fbase_pbCopyBndryVrt.pXReplaceElt = nil;
  1398. X    fbase_pbCopyBndryVrt.pStampTime = nil;
  1399. X
  1400. X    return(VEOS_SUCCESS);
  1401. X    
  1402. X    } /* Fbase_InitMatcherPBs */
  1403. X/*--------------------------------------------------------------------------------*/
  1404. X
  1405. X
  1406. X
  1407. END_OF_FILE
  1408. if test 11012 -ne `wc -c <'kernel_private/src/fern/fern.c'`; then
  1409.     echo shar: \"'kernel_private/src/fern/fern.c'\" unpacked with wrong size!
  1410. fi
  1411. # end of 'kernel_private/src/fern/fern.c'
  1412. fi
  1413. if test -f 'src/kernel_current/fern/fe_bnd.lsp' -a "${1}" != "-c" ; then 
  1414.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fe_bnd.lsp'\"
  1415. else
  1416. echo shar: Extracting \"'src/kernel_current/fern/fe_bnd.lsp'\" \(10935 characters\)
  1417. sed "s/^X//" >'src/kernel_current/fern/fe_bnd.lsp' <<'END_OF_FILE'
  1418. X;;-----------------------------------------------------------
  1419. X;; file: fe_bnd.lsp
  1420. X;;
  1421. X;; FERN is the Fractal Entity Relativity Node.
  1422. X;; Part of the FE component of the Fern System.
  1423. X;;
  1424. X;; creation: March 28, 1992
  1425. X;;
  1426. X;; by Geoffrey P. Coco at the HITLab, Seattle
  1427. X;;-----------------------------------------------------------
  1428. X
  1429. X
  1430. X;;-----------------------------------------------------------
  1431. X;; Copyright (C) 1992  Geoffrey P. Coco,
  1432. X;; Human Interface Technology Lab, Seattle
  1433. X;;-----------------------------------------------------------
  1434. X
  1435. X
  1436. X
  1437. X;;===========================================================
  1438. X;;              Boundary
  1439. X;;===========================================================
  1440. X
  1441. X(defun fe-put.bndry (bndry)
  1442. X  (vput bndry '((~ "perc"
  1443. X           @
  1444. X           > @
  1445. X           @) **)))
  1446. X
  1447. X;;-----------------------------------------------------------
  1448. X
  1449. X(defun fe-copy.bndry (&key (test-time nil))
  1450. X  (car (vcopy '(("perc"
  1451. X         @
  1452. X         > @
  1453. X         @) **)
  1454. X          :test-time test-time)))
  1455. X
  1456. X;;-----------------------------------------------------------
  1457. X
  1458. X(defun fe-xtrct.bndry ()
  1459. X  (vget '(("perc"
  1460. X       @
  1461. X       (> @@)
  1462. X       @) **)))
  1463. X
  1464. X;;-----------------------------------------------------------
  1465. X
  1466. X(defun fe-get.bndry ()
  1467. X  (car (vput "%" '((~ "perc"
  1468. X              @
  1469. X              > @
  1470. X              @) **))))
  1471. X
  1472. X;;-----------------------------------------------------------
  1473. X
  1474. X
  1475. X
  1476. X;;===========================================================
  1477. X;;               Virtual
  1478. X;;===========================================================
  1479. X
  1480. X;; returns old virtual bndry
  1481. X(defun fe-put.bndry.vrt (vbndry)
  1482. X  (car (vput vbndry '((~ "perc"
  1483. X             @
  1484. X             (@ > @ @)
  1485. X             @) **))))
  1486. X
  1487. X;;-----------------------------------------------------------
  1488. X
  1489. X;; cache this frequently used pattern in C level fern.
  1490. X;; later, calls to fe-copy.bndry.vrt use precomputed pattern.
  1491. X
  1492. X(fbase-init-copy.bndry.vrt '(("perc"
  1493. X                  @
  1494. X                  (@ > @ @)
  1495. X                  @) **))
  1496. X
  1497. X#|
  1498. X(defun fe-copy.bndry.vrt (&key (test-time nil))
  1499. X  (car (vcopy '(("perc"
  1500. X         @
  1501. X         (@ > @ @)
  1502. X         @) **)
  1503. X          :test-time test-time)))
  1504. X|#
  1505. X;;-----------------------------------------------------------
  1506. X
  1507. X(defun fe-xtrct.bndry.vrt ()
  1508. X  (vget '(("perc"
  1509. X       @
  1510. X       (@ (> @@) @)
  1511. X       @) **)))
  1512. X
  1513. X;;-----------------------------------------------------------
  1514. X
  1515. X(defun fe-get.bndry.vrt ()
  1516. X  (car (vput "%" '(("perc"
  1517. X            @
  1518. X            (@ > @ @)
  1519. X            @) **))))
  1520. X
  1521. X;;-----------------------------------------------------------
  1522. X
  1523. X
  1524. X
  1525. X;;===========================================================
  1526. X;;               Virtual Objects
  1527. X;;===========================================================
  1528. X
  1529. X(defun fe-jam.bndry.vrt.ob (ob)
  1530. X  (vput ob '((~ "perc"
  1531. X        @
  1532. X        (@ (^ @@) @)
  1533. X        @) **)))
  1534. X
  1535. X;;-----------------------------------------------------------
  1536. X
  1537. X;; objects are (ob-name (attr-list))
  1538. X(defun fe-put.bndry.vrt.ob (ob)
  1539. X  (cond
  1540. X
  1541. X   ;; assume object is already there
  1542. X   ((car (vput ob `((~ "perc"
  1543. X               @
  1544. X               (@ (> (,(car ob) @) **) @)
  1545. X               @) **))))
  1546. X
  1547. X   ;; object wasn't there, insert new one
  1548. X   ((fe-jam.bndry.vrt.ob ob))
  1549. X   ))
  1550. X
  1551. X;;-----------------------------------------------------------
  1552. X
  1553. X;; pass object name
  1554. X(defun fe-copy.bndry.vrt.ob (ob-name &key (test-time nil))
  1555. X  (car (vcopy `(("perc"
  1556. X         @
  1557. X         (@ (> (,ob-name @) **) @)
  1558. X         @) **)
  1559. X          :test-time test-time)))
  1560. X
  1561. X;;-----------------------------------------------------------
  1562. X
  1563. X(defun fe-xtrct.bndry.vrt.ob (ob-name)
  1564. X  (car (vget `(("perc"
  1565. X        @
  1566. X        (@ (> (,ob-name @) **) @)
  1567. X        @) **))))
  1568. X
  1569. X;;-----------------------------------------------------------
  1570. X
  1571. X(defun fe-get.bndry.vrt.ob (ob-name)
  1572. X  (car (vput "%" `((~ "perc"
  1573. X              @
  1574. X              (@ ((~ ,ob-name > @) **) @)
  1575. X              @) **))))
  1576. X
  1577. X;;-----------------------------------------------------------
  1578. X
  1579. X
  1580. X
  1581. X;;===========================================================
  1582. X;;          Virtual Object - Complex
  1583. X;;===========================================================
  1584. X
  1585. X(defun fe-copy.bndry.vrt.ob.names ()
  1586. X  (vcopy `(("perc"
  1587. X        @
  1588. X        (@ ((> @ @) **) @)
  1589. X        @) **)
  1590. X     :freq "all"))
  1591. X
  1592. X;;-----------------------------------------------------------
  1593. X
  1594. X
  1595. X
  1596. X
  1597. X;;===========================================================
  1598. X;;          Virtual Object Attributes
  1599. X;;===========================================================
  1600. X
  1601. X(defun fe-jam.bndry.vrt.ob.attr (ob-name attr)
  1602. X  (cond
  1603. X   ;; assume object exists, add new attr
  1604. X   ((vput attr `((~ "perc"
  1605. X            @
  1606. X            (@ ((~ ,ob-name (^ @@)) **) @)
  1607. X            @) **)))
  1608. X   
  1609. X   ;; object didn't exist, add new object with new attr.
  1610. X   ((fe-jam.bndry.vrt.ob `(,ob-name (,attr))))
  1611. X   ))
  1612. X
  1613. X;;-----------------------------------------------------------
  1614. X
  1615. X(defun fe-put.bndry.vrt.ob.attr (ob-name attr)
  1616. X  (cond
  1617. X
  1618. X   ;; assume the object and attr exist, swap in new attr
  1619. X   ((car (vput attr `((~ "perc"
  1620. X             @
  1621. X             (@ ((~ ,ob-name (> (,(car attr) @) **)) **) @)
  1622. X             @) **))))
  1623. X   
  1624. X   ;; attr didn't exist, add new attr
  1625. X   ((fe-jam.bndry.vrt.ob.attr ob-name attr))
  1626. X   ))
  1627. X
  1628. X;;-----------------------------------------------------------
  1629. X
  1630. X(defun fe-xtrct.bndry.vrt.ob.attr (ob-name attr-name)
  1631. X  (car (vget `(("perc"
  1632. X        @
  1633. X        (@ ((,ob-name (> (,attr-name @) **)) **) @)
  1634. X        @) **))))
  1635. X
  1636. X;;-----------------------------------------------------------
  1637. X
  1638. X(defun fe-get.bndry.vrt.ob.attr (ob-name attr-name)
  1639. X  (car (vput "%" `((~ "perc"
  1640. X              @
  1641. X              (@ ((~ ,ob-name ((~ ,attr-name > @) **)) **) @)
  1642. X              @) **))))
  1643. X
  1644. X;;-----------------------------------------------------------
  1645. X
  1646. X;; returns attr struct
  1647. X(defun fe-copy.bndry.vrt.ob.attr (ob-name attr-name &key (test-time nil))
  1648. X  (car (vcopy `(("perc"
  1649. X         @
  1650. X         (@ ((,ob-name (> (,attr-name @) **)) **) @)
  1651. X         @) **)
  1652. X          :test-time test-time)))
  1653. X  
  1654. X;;-----------------------------------------------------------
  1655. X
  1656. X
  1657. X
  1658. X;;===========================================================
  1659. X;;         Virtual Object Attributes - Complex
  1660. X;;===========================================================
  1661. X
  1662. X;; returns list of boundary attribute names
  1663. X(defun fe-copy.bndry.vrt.ob.attr.names (ob-name)
  1664. X  (vcopy `(("perc"
  1665. X        @
  1666. X        (@ ((,ob-name ((> @ @) **)) **) @)
  1667. X        @) **)
  1668. X     :freq "all"))
  1669. X
  1670. X;;-----------------------------------------------------------
  1671. X
  1672. X;; returns attr val
  1673. X(defun fe-copy.bndry.vrt.ob.attr.val (ob-name attr-name)
  1674. X  (car (vcopy `(("perc"
  1675. X         @
  1676. X         (@ ((,ob-name ((,attr-name > @) **)) **) @)
  1677. X         @) **))))
  1678. X  
  1679. X;;-----------------------------------------------------------
  1680. X
  1681. X
  1682. X
  1683. X
  1684. X;;===========================================================
  1685. X;;            Physical Sub-Partition
  1686. X;;===========================================================
  1687. X
  1688. X;; returns old physical bndry
  1689. X(defun fe-put.bndry.phys (vbndry)
  1690. X  (car (vput vbndry '((~ "perc"
  1691. X             @
  1692. X             (@2 > @)
  1693. X             @) **))))
  1694. X
  1695. X;;-----------------------------------------------------------
  1696. X
  1697. X(defun fe-copy.bndry.phys (&key (test-time nil))
  1698. X  (car (vcopy '(("perc"
  1699. X         @
  1700. X         (@2 > @)
  1701. X         @) **)
  1702. X          :test-time test-time)))
  1703. X
  1704. X;;-----------------------------------------------------------
  1705. X
  1706. X(defun fe-xtrct.bndry.phys ()
  1707. X  (vget '(("perc"
  1708. X       @
  1709. X       (@2 (> @@))
  1710. X       @) **)))
  1711. X
  1712. X;;-----------------------------------------------------------
  1713. X
  1714. X(defun fe-get.bndry.phys ()
  1715. X  (car (vput "%" '((~ "perc"
  1716. X              @
  1717. X              (@2 > @)
  1718. X              @) **))))
  1719. X
  1720. X;;-----------------------------------------------------------
  1721. X
  1722. X
  1723. X
  1724. X;;===========================================================
  1725. X;;               Physical Objects
  1726. X;;===========================================================
  1727. X
  1728. X(defun fe-jam.bndry.phys.ob (ob)
  1729. X  (vput ob '((~ "perc"
  1730. X        @
  1731. X        (@2 (^ @@))
  1732. X        @) **)))
  1733. X  
  1734. X;;-----------------------------------------------------------
  1735. X
  1736. X;; objects are (ob-name (attr-list))
  1737. X(defun fe-put.bndry.phys.ob (ob)
  1738. X  (cond
  1739. X
  1740. X   ;; assume object is already there
  1741. X   ((car (vput ob `((~ "perc"
  1742. X               @
  1743. X               (@2 (> (,(car ob) @) **))
  1744. X               @) **))))
  1745. X
  1746. X   ;; object wasn't there, insert new one
  1747. X   ((fe-jam.bndry.phys.ob ob))
  1748. X   ))
  1749. X
  1750. X;;-----------------------------------------------------------
  1751. X
  1752. X;; pass object name
  1753. X(defun fe-copy.bndry.phys.ob (ob-name &key (test-time nil))
  1754. X  (car (vcopy `(("perc"
  1755. X         @
  1756. X         (@2 (> (,ob-name @) **))
  1757. X         @) **)
  1758. X          :test-time test-time)))
  1759. X
  1760. X;;-----------------------------------------------------------
  1761. X
  1762. X(defun fe-xtrct.bndry.phys.ob (ob-name)
  1763. X  (car (vget `(("perc"
  1764. X        @
  1765. X        (@2 (> (,ob-name @) **))
  1766. X        @) **))))
  1767. X
  1768. X;;-----------------------------------------------------------
  1769. X
  1770. X(defun fe-get.bndry.phys.ob (ob-name)
  1771. X  (car (vput "%" `((~ "perc"
  1772. X              @
  1773. X              (@2 ((~ ,ob-name > @) **))
  1774. X              @) **))))
  1775. X
  1776. X;;-----------------------------------------------------------
  1777. X
  1778. X
  1779. X
  1780. X
  1781. X;;===========================================================
  1782. X;;          Physical Object - Complex
  1783. X;;===========================================================
  1784. X
  1785. X(defun fe-copy.bndry.phys.ob.names ()
  1786. X  (vcopy `(("perc"
  1787. X        @
  1788. X        (@2 ((> @ @) **))
  1789. X        @) **)
  1790. X     :freq "all"))
  1791. X
  1792. X;;-----------------------------------------------------------
  1793. X
  1794. X
  1795. X
  1796. X
  1797. X;;===========================================================
  1798. X;;          Physical Object Attributes
  1799. X;;===========================================================
  1800. X
  1801. X(defun fe-jam.bndry.phys.ob.attr (ob-name attr)
  1802. X  (cond
  1803. X   ;; assume object exists, add new attr
  1804. X   ((vput attr `((~ "perc"
  1805. X            @
  1806. X            (@2 ((~ ,ob-name (^ @@)) **))
  1807. X            @) **)))
  1808. X
  1809. X   ;; object didn't exist, add new object with new attr.
  1810. X   ((fe-jam.bndry.phys.ob `(,ob-name (,attr))))
  1811. X   ))
  1812. X
  1813. X;;-----------------------------------------------------------
  1814. X
  1815. X(defun fe-put.bndry.phys.ob.attr (ob-name attr)
  1816. X  (cond
  1817. X
  1818. X   ;; assume the object and attr exist, swap in new attr
  1819. X   ((car (vput attr `((~ "perc"
  1820. X             @
  1821. X             (@2 ((~ ,ob-name (> (,(car attr) @) **)) **))
  1822. X             @) **))))
  1823. X   
  1824. X   ;; attr didn't exist, add new attr
  1825. X   ((fe-jam.bndry.phys.ob.attr ob-name attr))
  1826. X   ))
  1827. X
  1828. X;;-----------------------------------------------------------
  1829. X
  1830. X(defun fe-xtrct.bndry.phys.ob.attr (ob-name attr-name)
  1831. X  (car (vget `(("perc"
  1832. X        @
  1833. X        (@2 ((,ob-name (> (,attr-name @) **)) **))
  1834. X        @) **))))
  1835. X
  1836. X;;-----------------------------------------------------------
  1837. X
  1838. X(defun fe-get.bndry.phys.ob.attr (ob-name attr-name)
  1839. X  (car (vput "%" `((~ "perc"
  1840. X              @
  1841. X              (@2 ((~ ,ob-name ((~ ,attr-name > @) **)) **))
  1842. X              @) **))))
  1843. X
  1844. X;;-----------------------------------------------------------
  1845. X
  1846. X;; returns attr struct
  1847. X(defun fe-copy.bndry.phys.ob.attr (ob-name attr-name &key (test-time nil))
  1848. X  (car (vcopy `(("perc"
  1849. X         @
  1850. X         (@2 ((,ob-name (> (,attr-name @) **)) **))
  1851. X         @) **)
  1852. X          :test-time test-time)))
  1853. X  
  1854. X;;-----------------------------------------------------------
  1855. X
  1856. X
  1857. X
  1858. X;;===========================================================
  1859. X;;         Physical Object Attributes - Complex
  1860. X;;===========================================================
  1861. X
  1862. X;; returns list of boundary attribute names
  1863. X(defun fe-copy.bndry.phys.ob.attr.names (ob-name)
  1864. X  (vcopy `(("perc"
  1865. X        @
  1866. X        (@2 ((,ob-name ((> @ @) **)) **))
  1867. X        @) **)
  1868. X     :freq "all"))
  1869. X
  1870. X;;-----------------------------------------------------------
  1871. X
  1872. X;; returns attr val
  1873. X(defun fe-copy.bndry.phys.ob.attr.val (ob-name attr-name)
  1874. X  (car (vcopy `(("perc"
  1875. X         @
  1876. X         (@2 ((,ob-name ((,attr-name > @) **)) **))
  1877. X         @) **))))
  1878. X  
  1879. X;;-----------------------------------------------------------
  1880. X
  1881. X
  1882. X
  1883. X
  1884. END_OF_FILE
  1885. if test 10935 -ne `wc -c <'src/kernel_current/fern/fe_bnd.lsp'`; then
  1886.     echo shar: \"'src/kernel_current/fern/fe_bnd.lsp'\" unpacked with wrong size!
  1887. fi
  1888. # end of 'src/kernel_current/fern/fe_bnd.lsp'
  1889. fi
  1890. if test -f 'src/kernel_current/fern/fe_ext.lsp' -a "${1}" != "-c" ; then 
  1891.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fe_ext.lsp'\"
  1892. else
  1893. echo shar: Extracting \"'src/kernel_current/fern/fe_ext.lsp'\" \(11360 characters\)
  1894. sed "s/^X//" >'src/kernel_current/fern/fe_ext.lsp' <<'END_OF_FILE'
  1895. X;;-----------------------------------------------------------
  1896. X;; file: fe_ext.lsp
  1897. X;;
  1898. X;; FERN is the Fractal Entity Relativity Node.
  1899. X;; Part of the FE component of the Fern System.
  1900. X;;
  1901. X;; creation: March 28, 1992
  1902. X;;
  1903. X;; by Geoffrey P. Coco at the HITLab, Seattle
  1904. X;;-----------------------------------------------------------
  1905. X
  1906. X
  1907. X;;-----------------------------------------------------------
  1908. X;; Copyright (C) 1992  Geoffrey P. Coco,
  1909. X;; Human Interface Technology Lab, Seattle
  1910. X;;-----------------------------------------------------------
  1911. X
  1912. X
  1913. X;;===========================================================
  1914. X;;              External
  1915. X;;===========================================================
  1916. X
  1917. X(defun fe-put.ext (ext)
  1918. X  (vput ext '((~ "perc"
  1919. X         > @
  1920. X         @
  1921. X         @) **)))
  1922. X
  1923. X;;-----------------------------------------------------------
  1924. X
  1925. X(defun fe-copy.ext (&key (test-time nil))
  1926. X  (car (vcopy '(("perc"
  1927. X         > @
  1928. X         @
  1929. X         @) **)
  1930. X          :test-time test-time)))
  1931. X
  1932. X;;-----------------------------------------------------------
  1933. X
  1934. X(defun fe-xtrct.ext ()
  1935. X  (vget '(("perc"
  1936. X       (> @@)
  1937. X       @
  1938. X       @) **)))
  1939. X
  1940. X;;-----------------------------------------------------------
  1941. X
  1942. X(defun fe-get.ext ()
  1943. X  (car (vput "%" '((~ "perc"
  1944. X              > @
  1945. X              @
  1946. X              @) **))))
  1947. X
  1948. X;;-----------------------------------------------------------
  1949. X
  1950. X
  1951. X
  1952. X;;===========================================================
  1953. X;;            Spaces Sub-Partition
  1954. X;;===========================================================
  1955. X
  1956. X;; returns old space-list
  1957. X(defun fe-put.ext.sps (sps)
  1958. X  (car (vput sps '((~ "perc"
  1959. X              (> @ @2)
  1960. X              @2) **))))
  1961. X
  1962. X;;-----------------------------------------------------------
  1963. X
  1964. X(defun fe-copy.ext.sps (&key (test-time nil))
  1965. X  (car (vcopy '(("perc"
  1966. X         (> @ @2)
  1967. X         @2) **)
  1968. X          :test-time test-time)))
  1969. X
  1970. X;;-----------------------------------------------------------
  1971. X
  1972. X(defun fe-xtrct.ext.sps ()
  1973. X  (vget '(("perc"
  1974. X       ((> @@) @2)
  1975. X       @2) **)))
  1976. X
  1977. X;;-----------------------------------------------------------
  1978. X
  1979. X(defun fe-get.ext.sps ()
  1980. X  (car (vput "%" '((~ "perc"
  1981. X              (> @ @2)
  1982. X              @2) **))))
  1983. X
  1984. X;;-----------------------------------------------------------
  1985. X
  1986. X
  1987. X;;===========================================================
  1988. X;;               Spaces Entities
  1989. X;;===========================================================
  1990. X
  1991. X;; an ent is (uid data)
  1992. X(defun fe-jam.ext.sps.ent (ent)
  1993. X  (vput ent '((~ "perc"
  1994. X         ((^ @@) @2)
  1995. X         @2) **)))
  1996. X
  1997. X;;-----------------------------------------------------------
  1998. X
  1999. X;; an ent is (uid data)
  2000. X(defun fe-put.ext.sps.ent (ent)
  2001. X  (cond
  2002. X   ;; assume the entity already exists, swap in new one
  2003. X   ((car (vput ent `((~ "perc"
  2004. X            ((> (,(car ent) @) **) @2)
  2005. X            @2) **))))
  2006. X
  2007. X   ;; entity didn' exist, insert new ent
  2008. X   ((fe-jam.ext.sps.ent ent))))
  2009. X
  2010. X;;-----------------------------------------------------------
  2011. X
  2012. X(defun fe-copy.ext.sps.ent (uid &key (test-time nil))
  2013. X  (car (vcopy `(("perc"
  2014. X         ((> (,uid @) **) @2)
  2015. X         @2) **)
  2016. X          :test-time test-time)))
  2017. X
  2018. X;;-----------------------------------------------------------
  2019. X
  2020. X(defun fe-xtrct.ext.sps.ent (uid)
  2021. X  (car (vget `(("perc"
  2022. X        ((> (,uid @) **) @2)
  2023. X        @2) **))))
  2024. X
  2025. X;;-----------------------------------------------------------
  2026. X
  2027. X(defun fe-get.ext.sps.ent (uid)
  2028. X  (car (vput "%" `((~ "perc"
  2029. X              (((~ ,uid > @) **) @2)
  2030. X              @2) **))))
  2031. X
  2032. X;;-----------------------------------------------------------
  2033. X
  2034. X
  2035. X
  2036. X;;===========================================================
  2037. X;;           Siblings Sub-Partition
  2038. X;;===========================================================
  2039. X
  2040. X;; returns old sib-list
  2041. X(defun fe-put.ext.sibs (sibs)
  2042. X  (car (vput sibs '((~ "perc"
  2043. X               (@ > @ @)
  2044. X               @2) **))))
  2045. X
  2046. X;;-----------------------------------------------------------
  2047. X
  2048. X(defun fe-copy.ext.sibs (&key (test-time nil))
  2049. X  (car (vcopy '(("perc"
  2050. X         (@ > @ @)
  2051. X         @2) **)
  2052. X          :test-time test-time)))
  2053. X
  2054. X;;-----------------------------------------------------------
  2055. X
  2056. X(defun fe-xtrct.ext.sibs ()
  2057. X  (vget '(("perc"
  2058. X       (@ (> @@) @)
  2059. X       @2) **)))
  2060. X
  2061. X;;-----------------------------------------------------------
  2062. X
  2063. X(defun fe-get.ext.sibs ()
  2064. X  (car (vput "%" '((~ "perc"
  2065. X              (@ > @ @)
  2066. X              @2) **))))
  2067. X
  2068. X;;-----------------------------------------------------------
  2069. X
  2070. X
  2071. X
  2072. X;;===========================================================
  2073. X;;              Siblings Entities
  2074. X;;===========================================================
  2075. X
  2076. X(defun fe-jam.ext.sibs.ent (ent)
  2077. X  (vput ent '((~ "perc"
  2078. X         (@ (^ @@) @)
  2079. X         @2) **)))
  2080. X   
  2081. X;;-----------------------------------------------------------
  2082. X
  2083. X;; sibling entities are in the form: (uid (virtual object list))
  2084. X(defun fe-put.ext.sibs.ent (ent)
  2085. X  (cond
  2086. X   ;; assume the ent exists, swap in new ent
  2087. X   ((car (vput ent `((~ "perc"
  2088. X            (@ (> (,(car ent) @) **) @)
  2089. X            @2) **))))
  2090. X   ;; the ent didn't exist, add new ent
  2091. X   ((fe-jam.ext.sibs.ent ent))
  2092. X   ))
  2093. X
  2094. X;;-----------------------------------------------------------
  2095. X
  2096. X(defun fe-copy.ext.sibs.ent (uid &key (test-time nil))
  2097. X  (car (vcopy `(("perc"
  2098. X         (@ (> (,uid @) **) @)
  2099. X         @2) **)
  2100. X          :test-time test-time)))
  2101. X
  2102. X;;-----------------------------------------------------------
  2103. X
  2104. X(defun fe-xtrct.ext.ents.ent (uid)
  2105. X  (car (vget `(("perc"
  2106. X        (@ (> (,uid @) **) @)
  2107. X        @2) **))))
  2108. X
  2109. X;;-----------------------------------------------------------
  2110. X
  2111. X(defun fe-get.ext.ents.ent (uid)
  2112. X  (car (vput "%" `((~ "perc"
  2113. X              (@ ((~ ,uid > @) **) @)
  2114. X              @2) **))))
  2115. X
  2116. X;;-----------------------------------------------------------
  2117. X
  2118. X
  2119. X
  2120. X;;===========================================================
  2121. X;;         Siblings Entities - Complex
  2122. X;;===========================================================
  2123. X
  2124. X;; returns list of all external sibs' uids
  2125. X(defun fe-copy.ext.sibs.uids ()
  2126. X  (vcopy '(("perc"
  2127. X        (@ ((> @ @) **) @)
  2128. X        @2) **)
  2129. X     :freq "all"))
  2130. X
  2131. X;;-----------------------------------------------------------
  2132. X
  2133. X
  2134. X
  2135. X
  2136. X;;===========================================================
  2137. X;;          Sibling Entities Objects
  2138. X;;===========================================================
  2139. X
  2140. X(defun fe-jam.ext.sibs.ent.ob (uid ob)
  2141. X  (cond
  2142. X
  2143. X   ;; assume entity exists, insert new object
  2144. X   ((vput ob `((~ "perc"
  2145. X          (@ ((~ ,uid (^ @@)) **) @)
  2146. X          @2) **)))
  2147. X
  2148. X   ;; entity wasn't there, insert new entity with new object
  2149. X   ((fe-jam.ext.sibs.ent `(,uid (,ob))))
  2150. X   ))
  2151. X   
  2152. X;;-----------------------------------------------------------
  2153. X
  2154. X;; ob is a normal object structure: (name (attr-list))
  2155. X(defun fe-put.ext.sibs.ent.ob (uid ob)
  2156. X  (cond
  2157. X
  2158. X   ;; assume entity and object exist, swap in new object
  2159. X   ((car (vput ob `((~ "perc"
  2160. X               (@ ((~ ,uid (> (,(car ob) @) **)) **) @)
  2161. X               @2) **))))
  2162. X   
  2163. X   ;; object wasn't there, assume entity exists, insert new object
  2164. X   ((fe-jam.ext.sibs.ent.ob uid ob))
  2165. X   ))
  2166. X   
  2167. X;;-----------------------------------------------------------
  2168. X
  2169. X(defun fe-copy.ext.sibs.ent.ob (uid ob-name &key (test-time nil))
  2170. X  (car (vcopy `(("perc"
  2171. X         (@ ((,uid (> (,ob-name @) **)) **) @)
  2172. X         @2) **)
  2173. X          :test-time test-time)))
  2174. X
  2175. X;;-----------------------------------------------------------
  2176. X
  2177. X(defun fe-xtrct.ext.sibs.ent.ob (uid ob-name)
  2178. X  (car (vget `(("perc"
  2179. X        (@ ((,uid (> (,ob-name @) **)) **) @)
  2180. X        @2) **))))
  2181. X
  2182. X;;-----------------------------------------------------------
  2183. X
  2184. X(defun fe-get.ext.sibs.ent.ob (uid ob-name)
  2185. X  (car (vput "%" `((~ "perc"
  2186. X              (@ ((~ ,uid ((~ ,ob-name > @) **)) **) @)
  2187. X              @2) **))))
  2188. X
  2189. X;;-----------------------------------------------------------
  2190. X
  2191. X
  2192. X
  2193. X;;===========================================================
  2194. X;;         Sibling Entities Objects - Complex
  2195. X;;===========================================================
  2196. X
  2197. X;; pass uid, get list of it's ob names
  2198. X(defun fe-copy.ext.sibs.ent.ob.names (uid)
  2199. X  (vcopy `(("perc"
  2200. X        (@ ((,uid ((> @ @) **)) **) @)
  2201. X        @2) **)
  2202. X     :freq "all"))
  2203. X
  2204. X;;-----------------------------------------------------------
  2205. X
  2206. X
  2207. X
  2208. X;;===========================================================
  2209. X;;         Sibling Entities Objects Attributes
  2210. X;;===========================================================
  2211. X
  2212. X
  2213. X(defun fe-jam.ext.sibs.ent.ob.attr (uid ob-name attr)
  2214. X  (cond
  2215. X   ;; assume entity and ob exists, insert new attr
  2216. X   ((vput attr `((~ "perc"
  2217. X          (@
  2218. X           ((~ ,uid ((~ ,ob-name (^ @@)) **)) **)
  2219. X           @)
  2220. X          @2) **)))
  2221. X  
  2222. X   ;; ob wasn't there, insert new ob with new attr
  2223. X   ((fe-jam.ext.sibs.ent.ob uid `(,ob-name (,attr))))
  2224. X   ))
  2225. X
  2226. X;;-----------------------------------------------------------
  2227. X
  2228. X;; attr is ("attr-name" attr-val)
  2229. X(defun fe-put.ext.sibs.ent.ob.attr (uid ob-name attr)
  2230. X  (cond
  2231. X   ;; assume the ent, ob and attr exist, swap in new attr
  2232. X   ((car (vput attr `((~ "perc"
  2233. X             (@ 
  2234. X              ((~ ,uid ((~ ,ob-name (> (,(car attr) @) **)) **)) **)
  2235. X              @)
  2236. X             @2) **))))
  2237. X
  2238. X   ;; attr wasn't there, insert new attr
  2239. X   ((fe-jam.ext.sibs.ent.ob.attr uid ob-name attr))
  2240. X   ))
  2241. X   
  2242. X;;-----------------------------------------------------------
  2243. X
  2244. X;; pass uid, ob-num, attr-name
  2245. X(defun fe-copy.ext.sibs.ent.ob.attr (uid ob-num attr-name &key (test-time nil))
  2246. X  (car (vcopy `(("perc"
  2247. X         (@
  2248. X          ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  2249. X          @)
  2250. X         @2) **)
  2251. X          :test-time test-time)))
  2252. X
  2253. X;;-----------------------------------------------------------
  2254. X
  2255. X;; pass uid, ob-num, attr-name
  2256. X(defun fe-xtrct.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  2257. X  (car (vget `(("perc"
  2258. X        (@
  2259. X         ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  2260. X         @)
  2261. X        @2) **))))
  2262. X
  2263. X;;-----------------------------------------------------------
  2264. X
  2265. X;; pass uid, ob-num, attr-name
  2266. X(defun fe-get.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  2267. X  (car (vput "%" `((~ "perc"
  2268. X            (@
  2269. X             ((~ ,uid ((~ ,ob-num ((~ ,attr-name > @) **)) **)) **)
  2270. X             @)
  2271. X            @2) **))))
  2272. X
  2273. X;;-----------------------------------------------------------
  2274. X
  2275. X
  2276. X;;===========================================================
  2277. X;;    Sibling Entities Objects Attributes - Complex
  2278. X;;===========================================================
  2279. X
  2280. X;; pass uid and ob, return attr-list
  2281. X(defun fe-copy.ext.sibs.ent.ob.attr.names (uid ob-name)
  2282. X  (vcopy `(("perc"
  2283. X        (@
  2284. X         ((,uid ((,ob-name ((> @ @) **)) **)) **)
  2285. X         @)
  2286. X        @2) **)
  2287. X     :freq "all"))
  2288. X
  2289. X;;-----------------------------------------------------------
  2290. X
  2291. X;; pass attr, return values of all objects of all sibs
  2292. X(defun fe-copy.ext.sibs.attr.vals (attr-name)
  2293. X  (vcopy `(("perc"
  2294. X        (@
  2295. X         ((@ ((@ ((,attr-name > @) **)) **)) **)
  2296. X         @)
  2297. X        @2) **)
  2298. X     :freq "all"))
  2299. X
  2300. X;;-----------------------------------------------------------
  2301. X
  2302. X;; pass uid, ob-num, attr-name
  2303. X(defun fe-copy.ext.sibs.ent.ob.attr.val (uid ob-num attr-name)
  2304. X  (car (vcopy `(("perc"
  2305. X         (@
  2306. X          ((,uid ((,ob-num ((,attr-name > @) **)) **)) **)
  2307. X          @)
  2308. X         @2) **))))
  2309. X
  2310. X;;-----------------------------------------------------------
  2311. X
  2312. X
  2313. X
  2314. X
  2315. X;;===========================================================
  2316. X;;            Filters Sub-Partition
  2317. X;;===========================================================
  2318. X
  2319. X;; filters are ("attr" (inclusion-list))
  2320. X(defun fe-put.ext.fltrs (fltrs)
  2321. X  (vput fltrs '((~ "perc"
  2322. X           (@2 > @)
  2323. X           @2) **)))
  2324. X
  2325. X;;-----------------------------------------------------------
  2326. X
  2327. X(defun fe-copy.ext.fltrs (&key (test-time nil))
  2328. X  (car (vcopy '(("perc"
  2329. X         (@2 > @)
  2330. X         @2) **)
  2331. X          :test-time test-time)))
  2332. X
  2333. X;;-----------------------------------------------------------
  2334. X
  2335. X(defun fe-xtrct.ext.fltrs ()
  2336. X  (vget '(("perc"
  2337. X       (@2 (> @@))
  2338. X       @2) **)))
  2339. X
  2340. X;;-----------------------------------------------------------
  2341. X
  2342. X(defun fe-get.ext.fltrs ()
  2343. X  (car (vput "%" '((~ "perc"
  2344. X              (@2 > @)
  2345. X              @2) **))))
  2346. X
  2347. X;;-----------------------------------------------------------
  2348. END_OF_FILE
  2349. if test 11360 -ne `wc -c <'src/kernel_current/fern/fe_ext.lsp'`; then
  2350.     echo shar: \"'src/kernel_current/fern/fe_ext.lsp'\" unpacked with wrong size!
  2351. fi
  2352. # end of 'src/kernel_current/fern/fe_ext.lsp'
  2353. fi
  2354. if test -f 'src/kernel_current/fern/fern.c' -a "${1}" != "-c" ; then 
  2355.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fern.c'\"
  2356. else
  2357. echo shar: Extracting \"'src/kernel_current/fern/fern.c'\" \(11012 characters\)
  2358. sed "s/^X//" >'src/kernel_current/fern/fern.c' <<'END_OF_FILE'
  2359. X/****************************************************************************************
  2360. X * file: fern.c                                        *
  2361. X *                                            *
  2362. X * February 25, 1992: implementation of the Fractal Entity Relativity Node for veos.    *
  2363. X *                                                    *
  2364. X * by Geoffrey P. Coco at the HITLab, Seattle.                          *
  2365. X *                                            *
  2366. X ****************************************************************************************/
  2367. X
  2368. X/****************************************************************************************
  2369. X * Copyright (C) 1992  Human Interface Technology Lab, Seattle                *
  2370. X ****************************************************************************************/
  2371. X
  2372. X
  2373. X/*--------------------------------------------------------------------------------*
  2374. X                 Preliminaries
  2375. X *--------------------------------------------------------------------------------*/
  2376. X
  2377. X
  2378. X#include "xlisp.h"
  2379. X#include "kernel.h"
  2380. X#include "xv_native.h"
  2381. X#include "fern.h"
  2382. X
  2383. X#include <math.h>
  2384. X
  2385. X/*--------------------------------------------------------------------------------*/
  2386. X
  2387. Xboolean        fbase_bInit = FALSE;
  2388. Xboolean        fbase_bGoing = FALSE;
  2389. XLVAL        s_pPersistFunc, s_pPersistProcs;
  2390. XTStampEntHash    fbase_pHashes[5];
  2391. Xint        fbase_iHashFree;
  2392. XTXMandRRec    fbase_pbCopyIntSubs;
  2393. XTXMandRRec    fbase_pbCopyBndryVrt;
  2394. X
  2395. X/*--------------------------------------------------------------------------------*/
  2396. X
  2397. Xvoid Fbase_Frame();
  2398. XTVeosErr Fbase_InitMatcherPBs();
  2399. X
  2400. X/*--------------------------------------------------------------------------------*/
  2401. X
  2402. X
  2403. X/*--------------------------------------------------------------------------------*
  2404. X                 Lisp Interface To Fern
  2405. X *--------------------------------------------------------------------------------*/
  2406. X
  2407. X
  2408. X/*--------------------------------------------------------------------------------*/
  2409. XLVAL Fbase_Init()
  2410. X{
  2411. X    if (!fbase_bInit) {
  2412. X
  2413. X    /** make permanent xlisp symbol to contain persist function call **/
  2414. X    
  2415. X    s_pPersistFunc = xlenter("FC-PRS-NTRY");
  2416. X    setvalue(s_pPersistFunc, cons(xlenter("FCON-PERSIST"), NIL));
  2417. X
  2418. X    s_pPersistProcs = xlenter("PERSIST-PROCS");
  2419. X
  2420. X    fbase_iHashFree = 0;
  2421. X
  2422. X    Fbase_InitMatcherPBs();
  2423. X    }
  2424. X
  2425. X    return(true);
  2426. X    }
  2427. X/*--------------------------------------------------------------------------------*/
  2428. X
  2429. X
  2430. X
  2431. X/*--------------------------------------------------------------------------------*/
  2432. XLVAL Fbase_fcon_time()
  2433. X{
  2434. X    xllastarg();
  2435. X
  2436. X    Fbase_Frame();
  2437. X
  2438. X    return(true);
  2439. X    } 
  2440. X/*--------------------------------------------------------------------------------*/
  2441. X
  2442. X
  2443. X/*--------------------------------------------------------------------------------*/
  2444. XLVAL Fbase_fcon_go()
  2445. X{
  2446. X    xllastarg();
  2447. X
  2448. X    fbase_bGoing = TRUE;
  2449. X    while (fbase_bGoing)
  2450. X    Fbase_Frame();
  2451. X
  2452. X    return(true);
  2453. X    }
  2454. X/*--------------------------------------------------------------------------------*/
  2455. X
  2456. X
  2457. X/*--------------------------------------------------------------------------------*/
  2458. XLVAL Fbase_fcon_local_ungo()
  2459. X{
  2460. X    xllastarg();
  2461. X
  2462. X    fbase_bGoing = FALSE;
  2463. X
  2464. X    return(true);
  2465. X    }
  2466. X/*--------------------------------------------------------------------------------*/
  2467. X
  2468. X
  2469. X/*--------------------------------------------------------------------------------*/
  2470. X/* returns: hash-table-index of new fern maintained hash table
  2471. X */
  2472. XLVAL Fbase_Hash_NewTab()
  2473. X{
  2474. X    int        i, iHashTab;
  2475. X    
  2476. X    iHashTab = fbase_iHashFree++;
  2477. X    for (i=0; i<12; i++)
  2478. X    fbase_pHashes[iHashTab][i] = nil;
  2479. X
  2480. X    return(cvfixnum(iHashTab));
  2481. X    }
  2482. X/*--------------------------------------------------------------------------------*/
  2483. X
  2484. X
  2485. X/*--------------------------------------------------------------------------------*/
  2486. X/* args: hash-table-refnum, new-uid, initial-float-data 
  2487. X */
  2488. XLVAL Fbase_Hash_AddUid()
  2489. X{
  2490. X    LVAL        pReturn = NIL, pUid;
  2491. X    int            i, iHashTab, iHashIndex;
  2492. X    float            fData;
  2493. X    TPStampEntRec    pNode, pFinger;
  2494. X
  2495. X    iHashTab = getfixnum(xlgafixnum());
  2496. X
  2497. X    pUid = xlgavector();
  2498. X#ifndef OPTIMAL
  2499. X    if (!IsUidElt(pUid))
  2500. X    xlbadtype(pUid);
  2501. X#endif
  2502. X
  2503. X    fData = getflonum(xlgaflonum());
  2504. X
  2505. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2506. X
  2507. X
  2508. X    /** check for this uid already in table...
  2509. X     ** if so, just update data
  2510. X     **/
  2511. X    for (pNode = fbase_pHashes[iHashTab][iHashIndex];
  2512. X     pNode;
  2513. X     pNode = pNode->pNext) {
  2514. X    
  2515. X    if (FBASE_HASH_HIT(pUid, pNode)) {
  2516. X        pNode->fData = fData;
  2517. X        pReturn = true;
  2518. X        break;
  2519. X        }
  2520. X    }
  2521. X
  2522. X    /** uid not found, add new hash entry.
  2523. X     **/
  2524. X    if (pReturn == NIL) {
  2525. X
  2526. X    if (Shell_NewBlock(sizeof(TStampEntRec), 
  2527. X               &pNode, "fern-hash-node") == VEOS_SUCCESS) {
  2528. X        
  2529. X        strcpy(pNode->sHost, getstring(getelement(pUid, 0)));
  2530. X        pNode->iPort = getfixnum(getelement(pUid, 1));
  2531. X        pNode->fData = fData;
  2532. X        
  2533. X        pNode->pNext = fbase_pHashes[iHashTab][iHashIndex];
  2534. X        fbase_pHashes[iHashTab][iHashIndex] = pNode;
  2535. X        
  2536. X        pReturn = true;
  2537. X        }
  2538. X    }
  2539. X
  2540. X    return(pReturn);
  2541. X    }
  2542. X/*--------------------------------------------------------------------------------*/
  2543. X
  2544. X
  2545. X/*--------------------------------------------------------------------------------*/
  2546. X/* args: hash-table-index, uid
  2547. X */
  2548. XLVAL Fbase_Hash_RemoveUid()
  2549. X{
  2550. X    LVAL        pReturn = NIL, pUid;
  2551. X    int            i, iHashTab, iHashIndex;
  2552. X    THStampEntRec    hFinger;
  2553. X    TPStampEntRec    pSave;
  2554. X
  2555. X    iHashTab = getfixnum(xlgafixnum());
  2556. X
  2557. X    pUid = xlgavector();
  2558. X    if (!IsUidElt(pUid))
  2559. X    xlbadtype(pUid);
  2560. X
  2561. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2562. X    for (hFinger = &(fbase_pHashes[iHashTab][iHashIndex]);
  2563. X     *hFinger;
  2564. X     hFinger = &(*hFinger)->pNext) {
  2565. X
  2566. X    if (FBASE_HASH_HIT(pUid, *hFinger)) {
  2567. X        pSave = *hFinger;
  2568. X        *hFinger = pSave->pNext;
  2569. X        Shell_ReturnBlock(pSave, sizeof(TStampEntRec), "fern-hash-node");
  2570. X        pReturn = true;
  2571. X        break;
  2572. X        }
  2573. X    }
  2574. X
  2575. X    return(pReturn);
  2576. X    }
  2577. X/*--------------------------------------------------------------------------------*/
  2578. X
  2579. X
  2580. X/*--------------------------------------------------------------------------------*/
  2581. X/* args: hash-table-index, uid, float-to-place-data.
  2582. X * returns: true or NIL
  2583. X */
  2584. XLVAL Fbase_Hash_HashUid()
  2585. X{
  2586. X    LVAL        pReturn = NIL, pUid, pData;
  2587. X    int            i, iHashTab, iHashIndex;
  2588. X    TPStampEntRec    pFinger;
  2589. X
  2590. X    iHashTab = getfixnum(xlgafixnum());
  2591. X
  2592. X    pUid = xlgavector();
  2593. X    if (!IsUidElt(pUid))
  2594. X    xlbadtype(pUid);
  2595. X
  2596. X    pData = xlgaflonum();
  2597. X
  2598. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2599. X    for (pFinger = fbase_pHashes[iHashTab][iHashIndex];
  2600. X     pFinger;
  2601. X     pFinger = pFinger->pNext) {
  2602. X    
  2603. X    if (FBASE_HASH_HIT(pUid, pFinger)) {
  2604. X        setflonum(pData, pFinger->fData);
  2605. X        pReturn = true;
  2606. X        break;
  2607. X        }
  2608. X    }
  2609. X
  2610. X    return(pReturn);
  2611. X    }
  2612. X/*--------------------------------------------------------------------------------*/
  2613. X
  2614. X
  2615. X/*--------------------------------------------------------------------------------*/
  2616. XLVAL Fbase_Init_CopyIntSubs()
  2617. X{
  2618. X    TVeosErr        iErr;
  2619. X
  2620. X    iErr = Native_GetPatternArg(&fbase_pbCopyIntSubs.pPatGr, NANCY_CopyMatch);
  2621. X
  2622. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  2623. X    }
  2624. X/*--------------------------------------------------------------------------------*/
  2625. X
  2626. X
  2627. X
  2628. X/*--------------------------------------------------------------------------------*/
  2629. XLVAL Fbase_CopyIntSubs()
  2630. X{
  2631. X    TVeosErr        iErr;
  2632. X    LVAL        pReturn;
  2633. X    TTimeStamp        tTest;
  2634. X
  2635. X
  2636. X    /** look for optional time-stamp-test **/
  2637. X
  2638. X    NATIVE_TIME_ARG(fbase_pbCopyIntSubs.pTestTime, tTest);
  2639. X
  2640. X
  2641. X    /** dispatch the matcher **/
  2642. X
  2643. X    xlsave1(fbase_pbCopyIntSubs.pXResult);
  2644. X    
  2645. X    Native_XMandR(&fbase_pbCopyIntSubs);
  2646. X
  2647. X    xlpop();
  2648. X
  2649. X    pReturn = consp(fbase_pbCopyIntSubs.pXResult) ?
  2650. X    car(fbase_pbCopyIntSubs.pXResult) : fbase_pbCopyIntSubs.pXResult;
  2651. X
  2652. X    return(pReturn);
  2653. X    }
  2654. X/*--------------------------------------------------------------------------------*/
  2655. X
  2656. X
  2657. X/*--------------------------------------------------------------------------------*/
  2658. XLVAL Fbase_Init_CopyBndryVrt()
  2659. X{
  2660. X    TVeosErr        iErr;
  2661. X
  2662. X    iErr = Native_GetPatternArg(&fbase_pbCopyBndryVrt.pPatGr, NANCY_CopyMatch);
  2663. X
  2664. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  2665. X    }
  2666. X/*--------------------------------------------------------------------------------*/
  2667. X
  2668. X
  2669. X
  2670. X/*--------------------------------------------------------------------------------*/
  2671. XLVAL Fbase_CopyBndryVrt()
  2672. X{
  2673. X    TVeosErr        iErr;
  2674. X    LVAL        pReturn;
  2675. X    TTimeStamp        tTest;
  2676. X
  2677. X
  2678. X    /** look for optional time-stamp-test **/
  2679. X
  2680. X    NATIVE_TIME_ARG(fbase_pbCopyBndryVrt.pTestTime, tTest);
  2681. X
  2682. X
  2683. X    /** dispatch the matcher **/
  2684. X
  2685. X    xlsave1(fbase_pbCopyBndryVrt.pXResult);
  2686. X    
  2687. X    Native_XMandR(&fbase_pbCopyBndryVrt);
  2688. X
  2689. X    xlpop();
  2690. X
  2691. X    pReturn = consp(fbase_pbCopyBndryVrt.pXResult) ?
  2692. X    car(fbase_pbCopyBndryVrt.pXResult) : fbase_pbCopyBndryVrt.pXResult;
  2693. X
  2694. X    return(pReturn);
  2695. X    }
  2696. X/*--------------------------------------------------------------------------------*/
  2697. X
  2698. X
  2699. X/*--------------------------------------------------------------------------------*
  2700. X           Beuratrcatic Linkage Between Fern Prims and XLISP
  2701. X *--------------------------------------------------------------------------------*/
  2702. X
  2703. X
  2704. X/*--------------------------------------------------------------------------------*/
  2705. XTVeosErr Fern_LoadPrims()
  2706. X{
  2707. X#define FERN_LOAD
  2708. X#include "fern_prims.h"
  2709. X#define FERN_LOAD
  2710. X    }
  2711. X/*--------------------------------------------------------------------------------*/
  2712. X
  2713. X
  2714. X
  2715. X/*--------------------------------------------------------------------------------*
  2716. X                   Private Functions
  2717. X *--------------------------------------------------------------------------------*/
  2718. X
  2719. X
  2720. X/*--------------------------------------------------------------------------------*/
  2721. XTVeosErr Fbase_()
  2722. X{
  2723. X    TVeosErr        iErr;
  2724. X
  2725. X    return(iErr);
  2726. X    }
  2727. X/*--------------------------------------------------------------------------------*/
  2728. X
  2729. X
  2730. X
  2731. X/*--------------------------------------------------------------------------------*/
  2732. Xvoid Fbase_Frame()
  2733. X{
  2734. X    LVAL        pMsg;
  2735. X
  2736. X
  2737. X    /** pass time to veos kernel for accounting.
  2738. X     **/
  2739. X    Kernel_SystemTask();
  2740. X
  2741. X
  2742. X    for (Native_NextMsg(&pMsg);
  2743. X     pMsg;
  2744. X     Native_NextMsg(&pMsg)) {
  2745. X
  2746. X    /** invoke normal lisp evaluator on message. 
  2747. X     **/ 
  2748. X    xlxeval(pMsg); 
  2749. X
  2750. X    /** at top of loop, when msgVar is set to next msg, 
  2751. X     ** old contents of msgVar are detached from any protected xlisp ptr, 
  2752. X     ** thus it will be garbage collected. 
  2753. X     **/ 
  2754. X    } 
  2755. X
  2756. X    /** do the persist procs. 
  2757. X     **/ 
  2758. X    if (!null(getvalue(s_pPersistProcs)))
  2759. X    xleval(getvalue(s_pPersistFunc));
  2760. X    }
  2761. X/*--------------------------------------------------------------------------------*/
  2762. X
  2763. X
  2764. X
  2765. X/*--------------------------------------------------------------------------------*/
  2766. XTVeosErr Fbase_InitMatcherPBs()
  2767. X{
  2768. X    /** copy-int-subs settings **/
  2769. X    
  2770. X    fbase_pbCopyIntSubs.pSrcGr = WORK_SPACE;
  2771. X    fbase_pbCopyIntSubs.iDestroyFlag = NANCY_CopyMatch;
  2772. X    fbase_pbCopyIntSubs.pXReplaceElt = nil;
  2773. X    fbase_pbCopyIntSubs.pStampTime = nil;
  2774. X
  2775. X    /** copy-bndry-vrt settings **/
  2776. X    
  2777. X    fbase_pbCopyBndryVrt.pSrcGr = WORK_SPACE;
  2778. X    fbase_pbCopyBndryVrt.iDestroyFlag = NANCY_CopyMatch;
  2779. X    fbase_pbCopyBndryVrt.pXReplaceElt = nil;
  2780. X    fbase_pbCopyBndryVrt.pStampTime = nil;
  2781. X
  2782. X    return(VEOS_SUCCESS);
  2783. X    
  2784. X    } /* Fbase_InitMatcherPBs */
  2785. X/*--------------------------------------------------------------------------------*/
  2786. X
  2787. X
  2788. X
  2789. END_OF_FILE
  2790. if test 11012 -ne `wc -c <'src/kernel_current/fern/fern.c'`; then
  2791.     echo shar: \"'src/kernel_current/fern/fern.c'\" unpacked with wrong size!
  2792. fi
  2793. # end of 'src/kernel_current/fern/fern.c'
  2794. fi
  2795. if test -f 'src/xlisp/xcore/c/xlimage.c' -a "${1}" != "-c" ; then 
  2796.   echo shar: Will not clobber existing file \"'src/xlisp/xcore/c/xlimage.c'\"
  2797. else
  2798. echo shar: Extracting \"'src/xlisp/xcore/c/xlimage.c'\" \(11043 characters\)
  2799. sed "s/^X//" >'src/xlisp/xcore/c/xlimage.c' <<'END_OF_FILE'
  2800. X/* -*-C-*-
  2801. X********************************************************************************
  2802. X*
  2803. X* File:         xlimage.c
  2804. X* RCS:          $Header: xlimage.c,v 1.5 89/11/25 05:30:58 mayer Exp $
  2805. X* Description:  xlisp memory image save/restore functions
  2806. X* Author:       David Michael Betz
  2807. X* Created:      
  2808. X* Modified:     Sat Nov 25 05:30:50 1989 (Niels Mayer) mayer@hplnpm
  2809. X* Language:     C
  2810. X* Package:      N/A
  2811. X* Status:       X11r4 contrib tape release
  2812. X*
  2813. X* WINTERP 1.0 Copyright 1989 Hewlett-Packard Company (by Niels Mayer).
  2814. X* XLISP version 2.1, Copyright (c) 1989, by David Betz.
  2815. X*
  2816. X* Permission to use, copy, modify, distribute, and sell this software and its
  2817. X* documentation for any purpose is hereby granted without fee, provided that
  2818. X* the above copyright notice appear in all copies and that both that
  2819. X* copyright notice and this permission notice appear in supporting
  2820. X* documentation, and that the name of Hewlett-Packard and David Betz not be
  2821. X* used in advertising or publicity pertaining to distribution of the software
  2822. X* without specific, written prior permission.  Hewlett-Packard and David Betz
  2823. X* make no representations about the suitability of this software for any
  2824. X* purpose. It is provided "as is" without express or implied warranty.
  2825. X*
  2826. X* HEWLETT-PACKARD AND DAVID BETZ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  2827. X* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  2828. X* IN NO EVENT SHALL HEWLETT-PACKARD NOR DAVID BETZ BE LIABLE FOR ANY SPECIAL,
  2829. X* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  2830. X* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  2831. X* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  2832. X* PERFORMANCE OF THIS SOFTWARE.
  2833. X*
  2834. X* See ./winterp/COPYRIGHT for information on contacting the authors.
  2835. X* 
  2836. X* Please send modifications, improvements and bugfixes to mayer@hplabs.hp.com
  2837. X* Post XLISP-specific questions/information to the newsgroup comp.lang.lisp.x
  2838. X*
  2839. X********************************************************************************
  2840. X*/
  2841. Xstatic char rcs_identity[] = "@(#)$Header: xlimage.c,v 1.5 89/11/25 05:30:58 mayer Exp $";
  2842. X
  2843. X
  2844. X#include "xlisp.h"
  2845. X
  2846. X#ifdef SAVERESTORE
  2847. X
  2848. X/* external variables */
  2849. Xextern LVAL obarray,xlenv,xlfenv,xldenv,s_gchook,s_gcflag;
  2850. Xextern long nnodes,nfree,total;
  2851. Xextern int anodes,nsegs,gccalls;
  2852. Xextern struct segment *segs,*lastseg,*fixseg,*charseg;
  2853. Xextern CONTEXT *xlcontext;
  2854. Xextern LVAL fnodes;
  2855. X
  2856. X/* local variables */
  2857. Xstatic OFFTYPE off,foff,doff;
  2858. Xstatic FILE *fp;
  2859. X
  2860. X/* external procedures */
  2861. Xextern SEGMENT *newsegment();
  2862. Xextern FILE *osbopen();
  2863. Xextern char *malloc();
  2864. X
  2865. X/* forward declarations */
  2866. XOFFTYPE readptr();
  2867. XOFFTYPE cvoptr();
  2868. XLVAL cviptr();
  2869. X
  2870. X/* xlisave - save the memory image */
  2871. Xint xlisave(fname)
  2872. X  char *fname;
  2873. X{
  2874. X    char fullname[STRMAX+1];
  2875. X    unsigned char *cp;
  2876. X    SEGMENT *seg;
  2877. X    int n,i,max;
  2878. X    LVAL p;
  2879. X
  2880. X    /* default the extension */
  2881. X    if (needsextension(fname)) {
  2882. X    strcpy(fullname,fname);
  2883. X    strcat(fullname,".wks");
  2884. X    fname = fullname;
  2885. X    }
  2886. X
  2887. X    /* open the output file */
  2888. X    if ((fp = osbopen(fname,"w")) == NULL)
  2889. X    return (FALSE);
  2890. X
  2891. X    /* first call the garbage collector to clean up memory */
  2892. X    gc();
  2893. X
  2894. X    /* write out the pointer to the *obarray* symbol */
  2895. X    writeptr(cvoptr(obarray));
  2896. X
  2897. X    /* setup the initial file offsets */
  2898. X    off = foff = (OFFTYPE)2;
  2899. X
  2900. X    /* write out all nodes that are still in use */
  2901. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  2902. X    p = &seg->sg_nodes[0];
  2903. X    for (n = seg->sg_size; --n >= 0; ++p, off += 2) {
  2904. X        switch (ntype(p)) {
  2905. X        case FREE:
  2906. X        break;
  2907. X        case CONS:
  2908. X        case USTREAM:
  2909. X        setoffset();
  2910. X        osbputc(p->n_type,fp);
  2911. X        writeptr(cvoptr(car(p)));
  2912. X        writeptr(cvoptr(cdr(p)));
  2913. X        foff += 2;
  2914. X        break;
  2915. X        default:
  2916. X        setoffset();
  2917. X        writenode(p);
  2918. X        break;
  2919. X        }
  2920. X        }
  2921. X    }
  2922. X
  2923. X    /* write the terminator */
  2924. X    osbputc(FREE,fp);
  2925. X    writeptr((OFFTYPE)0);
  2926. X
  2927. X    /* write out data portion of vector-like nodes */
  2928. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  2929. X    p = &seg->sg_nodes[0];
  2930. X    for (n = seg->sg_size; --n >= 0; ++p) {
  2931. X        switch (ntype(p)) {
  2932. X/* Include hybrid-class functions: *//* JSP */
  2933. X#define MODULE_XLIMAGE_C_XLISAVE
  2934. X#include "../../xmodules.h"
  2935. X#undef MODULE_XLIMAGE_C_XLISAVE
  2936. X
  2937. X        case SYMBOL:
  2938. X        case OBJECT:
  2939. X        case VECTOR:
  2940. X        case CLOSURE:
  2941. X        case STRUCT:
  2942. X            vector:
  2943. X        max = getsz(p);
  2944. X        for (i = 0; i < max; ++i)
  2945. X            writeptr(cvoptr(getelement(p,i)));
  2946. X        break;
  2947. X        case STRING:
  2948. X        max = getslength(p);
  2949. X        for (cp = getstring(p); --max >= 0; )
  2950. X            osbputc(*cp++,fp);
  2951. X        break;
  2952. X        }
  2953. X        }
  2954. X    }
  2955. X
  2956. X    /* close the output file */
  2957. X    osclose(fp);
  2958. X
  2959. X    /* return successfully */
  2960. X    return (TRUE);
  2961. X}
  2962. X
  2963. X/* xlirestore - restore a saved memory image */
  2964. Xint xlirestore(fname)
  2965. X  char *fname;
  2966. X{
  2967. X    extern FUNDEF *funtab;
  2968. X    char fullname[STRMAX+1];
  2969. X    unsigned char *cp;
  2970. X    int n,i,max,type;
  2971. X    SEGMENT *seg;
  2972. X    LVAL p;
  2973. X
  2974. X    /* default the extension */
  2975. X    if (needsextension(fname)) {
  2976. X    strcpy(fullname,fname);
  2977. X    strcat(fullname,".wks");
  2978. X    fname = fullname;
  2979. X    }
  2980. X
  2981. X    /* open the file */
  2982. X    if ((fp = osbopen(fname,"r")) == NULL)
  2983. X    return (FALSE);
  2984. X
  2985. X    /* free the old memory image */
  2986. X    freeimage();
  2987. X
  2988. X    /* initialize */
  2989. X    off = (OFFTYPE)2;
  2990. X    total = nnodes = nfree = 0L;
  2991. X    fnodes = NIL;
  2992. X    segs = lastseg = NULL;
  2993. X    nsegs = gccalls = 0;
  2994. X    xlenv = xlfenv = xldenv = s_gchook = s_gcflag = NIL;
  2995. X    xlstack = xlstkbase + EDEPTH;
  2996. X    xlcontext = NULL;
  2997. X
  2998. X    /* create the fixnum segment */
  2999. X    if ((fixseg = newsegment(SFIXSIZE)) == NULL)
  3000. X    xlfatal("insufficient memory - fixnum segment");
  3001. X
  3002. X    /* create the character segment */
  3003. X    if ((charseg = newsegment(CHARSIZE)) == NULL)
  3004. X    xlfatal("insufficient memory - character segment");
  3005. X
  3006. X    /* read the pointer to the *obarray* symbol */
  3007. X    obarray = cviptr(readptr());
  3008. X
  3009. X    /* read each node */
  3010. X    while ((type = osbgetc(fp)) >= 0)
  3011. X    switch (type) {
  3012. X    case FREE:
  3013. X        if ((off = readptr()) == (OFFTYPE)0)
  3014. X        goto done;
  3015. X        break;
  3016. X    case CONS:
  3017. X    case USTREAM:
  3018. X        p = cviptr(off);
  3019. X        p->n_type = type;
  3020. X        p->n_flags = 0;
  3021. X        rplaca(p,cviptr(readptr()));
  3022. X        rplacd(p,cviptr(readptr()));
  3023. X        off += 2;
  3024. X        break;
  3025. X    default:
  3026. X        readnode(type,cviptr(off));
  3027. X        off += 2;
  3028. X        break;
  3029. X    }
  3030. Xdone:
  3031. X
  3032. X    /* read the data portion of vector-like nodes */
  3033. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3034. X    p = &seg->sg_nodes[0];
  3035. X    for (n = seg->sg_size; --n >= 0; ++p)
  3036. X        switch (ntype(p)) {
  3037. X/* Include hybrid-class functions: *//* JSP */
  3038. X#define MODULE_XLIMAGE_C_XLIRESTORE
  3039. X#include "../../xmodules.h"
  3040. X#undef MODULE_XLIMAGE_C_XLIRESTORE
  3041. X        case SYMBOL:
  3042. X        case OBJECT:
  3043. X        case VECTOR:
  3044. X        case CLOSURE:
  3045. X        case STRUCT:
  3046. X            vector:
  3047. X        max = getsz(p);
  3048. X        if ((p->n_vdata = (LVAL *)malloc(max * sizeof(LVAL))) == NULL)
  3049. X            xlfatal("insufficient memory - vector");
  3050. X        total += (long)(max * sizeof(LVAL));
  3051. X        for (i = 0; i < max; ++i)
  3052. X            setelement(p,i,cviptr(readptr()));
  3053. X        break;
  3054. X        case STRING:
  3055. X        max = getslength(p);
  3056. X        if ((p->n_string = (unsigned char *)malloc(max)) == NULL)
  3057. X            xlfatal("insufficient memory - string");
  3058. X        total += (long)max;
  3059. X        for (cp = getstring(p); --max >= 0; )
  3060. X            *cp++ = osbgetc(fp);
  3061. X        break;
  3062. X        case STREAM:
  3063. X        setfile(p,NULL);
  3064. X        break;
  3065. X        case SUBR:
  3066. X        case FSUBR:
  3067. X        p->n_subr = funtab[getoffset(p)].fd_subr;
  3068. X        break;
  3069. X        }
  3070. X    }
  3071. X
  3072. X    /* close the input file */
  3073. X    osclose(fp);
  3074. X
  3075. X    /* collect to initialize the free space */
  3076. X    gc();
  3077. X
  3078. X    /* lookup all of the symbols the interpreter uses */
  3079. X    xlsymbols();
  3080. X
  3081. X    /* return successfully */
  3082. X    return (TRUE);
  3083. X}
  3084. X
  3085. X/* freeimage - free the current memory image */
  3086. XLOCAL freeimage()
  3087. X{
  3088. X    SEGMENT *seg,*next;
  3089. X    FILE *fp;
  3090. X    LVAL p;
  3091. X    int n;
  3092. X
  3093. X    /* free the data portion of vector-like nodes */
  3094. X    for (seg = segs; seg != NULL; seg = next) {
  3095. X    p = &seg->sg_nodes[0];
  3096. X    for (n = seg->sg_size; --n >= 0; ++p)
  3097. X        switch (ntype(p)) {
  3098. X/* Include hybrid-class functions: *//* JSP */
  3099. X#define MODULE_XLIMAGE_C_FREEIMAGE
  3100. X#include "../../xmodules.h"
  3101. X#undef MODULE_XLIMAGE_C_FREEIMAGE
  3102. X        case SYMBOL:
  3103. X        case OBJECT:
  3104. X        case VECTOR:
  3105. X        case CLOSURE:
  3106. X        case STRUCT:
  3107. X            vector:
  3108. X        if (p->n_vsize)
  3109. X            free(p->n_vdata);
  3110. X        break;
  3111. X        case STRING:
  3112. X        if (getslength(p))
  3113. X            free(getstring(p));
  3114. X        break;
  3115. X        case STREAM:
  3116. X                if ((fp  = getfile(p)) &&
  3117. X                    (fp != stdin       &&
  3118. X                     fp != stdout      && 
  3119. X                     fp != stderr)
  3120. X                ) {
  3121. X            osclose(getfile(p));
  3122. X                }
  3123. X        break;
  3124. X        }
  3125. X    next = seg->sg_next;
  3126. X    free(seg);
  3127. X    }
  3128. X}
  3129. X
  3130. X/* setoffset - output a positioning command if nodes have been skipped */
  3131. XLOCAL setoffset()
  3132. X{
  3133. X    if (off != foff) {
  3134. X    osbputc(FREE,fp);
  3135. X    writeptr(off);
  3136. X    foff = off;
  3137. X    }
  3138. X}
  3139. X
  3140. X/* writenode - write a node to a file */
  3141. XLOCAL writenode(node)
  3142. X  LVAL node;
  3143. X{
  3144. X    char *p = (char *)&node->n_info;
  3145. X    int n = sizeof(union ninfo);
  3146. X    osbputc(node->n_type,fp);
  3147. X    while (--n >= 0)
  3148. X    osbputc(*p++,fp);
  3149. X    foff += 2;
  3150. X}
  3151. X
  3152. X/* writeptr - write a pointer to a file */
  3153. XLOCAL writeptr(off)
  3154. X  OFFTYPE off;
  3155. X{
  3156. X    char *p = (char *)&off;
  3157. X    int n = sizeof(OFFTYPE);
  3158. X    while (--n >= 0)
  3159. X    osbputc(*p++,fp);
  3160. X}
  3161. X
  3162. X/* readnode - read a node */
  3163. XLOCAL readnode(type,node)
  3164. X  int type; LVAL node;
  3165. X{
  3166. X    char *p = (char *)&node->n_info;
  3167. X    int n = sizeof(union ninfo);
  3168. X    node->n_type = type;
  3169. X    node->n_flags = 0;
  3170. X    while (--n >= 0)
  3171. X    *p++ = osbgetc(fp);
  3172. X}
  3173. X
  3174. X/* readptr - read a pointer */
  3175. XLOCAL OFFTYPE readptr()
  3176. X{
  3177. X    OFFTYPE off;
  3178. X    char *p = (char *)&off;
  3179. X    int n = sizeof(OFFTYPE);
  3180. X    while (--n >= 0)
  3181. X    *p++ = osbgetc(fp);
  3182. X    return (off);
  3183. X}
  3184. X
  3185. X/* cviptr - convert a pointer on input */
  3186. XLOCAL LVAL cviptr(o)
  3187. X  OFFTYPE o;
  3188. X{
  3189. X    OFFTYPE off = (OFFTYPE)2;
  3190. X    SEGMENT *seg;
  3191. X
  3192. X    /* check for nil */
  3193. X    if (o == (OFFTYPE)0)
  3194. X    return ((LVAL)o);
  3195. X
  3196. X    /* compute a pointer for this offset */
  3197. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3198. X    if (o >= off && o < off + (OFFTYPE)(seg->sg_size << 1))
  3199. X        return (seg->sg_nodes + ((int)(o - off) >> 1));
  3200. X    off += (OFFTYPE)(seg->sg_size << 1);
  3201. X    }
  3202. X
  3203. X    /* create new segments if necessary */
  3204. X    for (;;) {
  3205. X
  3206. X    /* create the next segment */
  3207. X    if ((seg = newsegment(anodes)) == NULL)
  3208. X        xlfatal("insufficient memory - segment");
  3209. X
  3210. X    /* check to see if the offset is in this segment */
  3211. X    if (o >= off && o < off + (OFFTYPE)(seg->sg_size << 1))
  3212. X        return (seg->sg_nodes + ((int)(o - off) >> 1));
  3213. X    off += (OFFTYPE)(seg->sg_size << 1);
  3214. X    }
  3215. X}
  3216. X
  3217. X/* cvoptr - convert a pointer on output */
  3218. XLOCAL OFFTYPE cvoptr(p)
  3219. X  LVAL p;
  3220. X{
  3221. X    OFFTYPE off = (OFFTYPE)2;
  3222. X    SEGMENT *seg;
  3223. X
  3224. X    /* check for nil and small fixnums */
  3225. X    if (p == NIL)
  3226. X    return ((OFFTYPE)p);
  3227. X
  3228. X    /* compute an offset for this pointer */
  3229. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3230. X    if (CVPTR(p) >= CVPTR(&seg->sg_nodes[0]) &&
  3231. X        CVPTR(p) <  CVPTR(&seg->sg_nodes[0] + seg->sg_size))
  3232. X        return (off + (OFFTYPE)((p - seg->sg_nodes) << 1));
  3233. X    off += (OFFTYPE)(seg->sg_size << 1);
  3234. X    }
  3235. X
  3236. X    /* pointer not within any segment */
  3237. X    xlerror("bad pointer found during image save",p);
  3238. X}
  3239. X
  3240. X#endif
  3241. X
  3242. END_OF_FILE
  3243. if test 11043 -ne `wc -c <'src/xlisp/xcore/c/xlimage.c'`; then
  3244.     echo shar: \"'src/xlisp/xcore/c/xlimage.c'\" unpacked with wrong size!
  3245. fi
  3246. # end of 'src/xlisp/xcore/c/xlimage.c'
  3247. fi
  3248. echo shar: End of archive 5 \(of 16\).
  3249. cp /dev/null ark5isdone
  3250. MISSING=""
  3251. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
  3252.     if test ! -f ark${I}isdone ; then
  3253.     MISSING="${MISSING} ${I}"
  3254.     fi
  3255. done
  3256. if test "${MISSING}" = "" ; then
  3257.     echo You have unpacked all 16 archives.
  3258.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3259. else
  3260.     echo You still need to unpack the following archives:
  3261.     echo "        " ${MISSING}
  3262. fi
  3263. ##  End of shell archive.
  3264. exit 0
  3265.